Re: Макрос + шаблон = не компилится
От: yxiie Украина www.enkord.com
Дата: 08.10.04 17:59
Оценка: 6 (1)
Здравствуйте, 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 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.