Здравствуйте, SergH, Вы писали:
SH>Все здравствуйте.
SH>Вот такой код:
SH>SH>#define TYPEDEF_AS_BASE( t ) typedef t Base;
SH>template<class T1, class T2>
SH>class Some
SH>{
SH>};
SH>TYPEDEF_AS_BASE(Some< int, char >)
SH>void main()
SH>{
SH>}
SH>
я когда-то постоянно тыкался в такие проблемы препроцессора, пробовал решать склеивающими макросами, но вcе это не то!
в конце концов решил проблему так, что ничего лишнего дописывать не нужно.
если заюзать один мой workaround
/*
* unwind_params.h - macro parameters handling
* Copyright (c) 2004 by Yaroslav Yanovsky
*/
#ifndef BFX_UTILITY_UTILITY_UNWIND_PARAMS_H
#define BFX_UTILITY_UTILITY_UNWIND_PARAMS_H
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/facilities/apply.hpp>
#include <boost/preprocessor/facilities/identity.hpp>
#include <boost/preprocessor/logical/not.hpp>
#include <boost/preprocessor/facilities/empty.hpp>
// magic workaround
#define BOOST_PP_EXPR_IIF_BOOST_PP_CHECK_RESULT_
#pragma warning(disable: 4003)
// #pragma warning(once: 4003)
/**
@ingroup UtilityHelper
Unwinds parameters as raw comma-separated list. Useful for handling
templates
*/
#define BFX_UNWIND_PARAMS(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) \
P1\
BOOST_PP_COMMA_IF(BOOST_PP_NOT(BOOST_PP_CAT(BOOST_PP_APPLY(#P2),0))) \
BOOST_PP_IF(BOOST_PP_CAT(BOOST_PP_APPLY(#P2),0), BOOST_PP_EMPTY, BOOST_PP_IDENTITY(P2))() \
BOOST_PP_COMMA_IF(BOOST_PP_NOT(BOOST_PP_CAT(BOOST_PP_APPLY(#P3),0))) \
BOOST_PP_IF(BOOST_PP_CAT(BOOST_PP_APPLY(#P3),0), BOOST_PP_EMPTY, BOOST_PP_IDENTITY(P3))() \
BOOST_PP_COMMA_IF(BOOST_PP_NOT(BOOST_PP_CAT(BOOST_PP_APPLY(#P4),0))) \
BOOST_PP_IF(BOOST_PP_CAT(BOOST_PP_APPLY(#P4),0), BOOST_PP_EMPTY, BOOST_PP_IDENTITY(P4))() \
BOOST_PP_COMMA_IF(BOOST_PP_NOT(BOOST_PP_CAT(BOOST_PP_APPLY(#P5),0))) \
BOOST_PP_IF(BOOST_PP_CAT(BOOST_PP_APPLY(#P5),0), BOOST_PP_EMPTY, BOOST_PP_IDENTITY(P5))() \
BOOST_PP_COMMA_IF(BOOST_PP_NOT(BOOST_PP_CAT(BOOST_PP_APPLY(#P6),0))) \
BOOST_PP_IF(BOOST_PP_CAT(BOOST_PP_APPLY(#P6),0), BOOST_PP_EMPTY, BOOST_PP_IDENTITY(P6))() \
BOOST_PP_COMMA_IF(BOOST_PP_NOT(BOOST_PP_CAT(BOOST_PP_APPLY(#P7),0))) \
BOOST_PP_IF(BOOST_PP_CAT(BOOST_PP_APPLY(#P7),0), BOOST_PP_EMPTY, BOOST_PP_IDENTITY(P7))() \
BOOST_PP_COMMA_IF(BOOST_PP_NOT(BOOST_PP_CAT(BOOST_PP_APPLY(#P8),0))) \
BOOST_PP_IF(BOOST_PP_CAT(BOOST_PP_APPLY(#P8),0), BOOST_PP_EMPTY, BOOST_PP_IDENTITY(P8))() \
BOOST_PP_COMMA_IF(BOOST_PP_NOT(BOOST_PP_CAT(BOOST_PP_APPLY(#P9),0))) \
BOOST_PP_IF(BOOST_PP_CAT(BOOST_PP_APPLY(#P9),0), BOOST_PP_EMPTY, BOOST_PP_IDENTITY(P9))() \
BOOST_PP_COMMA_IF(BOOST_PP_NOT(BOOST_PP_CAT(BOOST_PP_APPLY(#P10),0))) \
BOOST_PP_IF(BOOST_PP_CAT(BOOST_PP_APPLY(#P10),0), BOOST_PP_EMPTY, BOOST_PP_IDENTITY(P10))()
#endif // BFX_UTILITY_UTILITY_UNWIND_PARAMS_H
то твой код можно переписать так:
#include "unwind_params.h"
#define TYPEDEF_AS_BASE(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) \
typedef BFX_UNWIND_PARAMS(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) Base;
template<class T1, class T2>
class Some
{
};
TYPEDEF_AS_BASE(Some< int, char >) // <-- использование не изменилось
void main()
{
}
то можно юзать именно в таком виде как ты хотел, с любым количеством вложенных шаблонных параметров
TYPEDEF_AS_BASE(Some<int, char>)
TYPEDEF_AS_BASE(Some<int>)
TYPEDEF_AS_BASE(Some<int, char, Object, pair<long, int> >)
TYPEDEF_AS_BASE(Some<int, Some< Some<int, int> > >)
вот так-то boost::preprocessor и рулит
... << RSDN@Home 1.1.3 stable >>