LINUX.ORG.RU

C preprocessor


0

0

Подозреваю что такое невозможно, но все таки :-)

Есть макрос с переменным числом параметров MACRO(...). Нужно для
каждого аргумента из __VA_ARGS__ заменить его на некоторый текст. Например: MACRO(int, float, MyType) заменить на
&typeid(int), &typeid(float), &typeid(MyType)

Нужно это чтобы сделать такую штуку:

#define DECLARE_TYPES( _name, ... ) \
const std::type_info* types_for_ ## _name [] = {\
MACRO(__VA_ARGS__),\
0\
}

Или только так?

#define BEGIN_DECLARATION( _name ) \
const std::type_info* types_for_ ## _name [] = {

#defome TYPE_FOR( _type ) &typeid(_type),

#define END_DECALRATION() \
0\
}

А вообщем - если кому попадались статьи про нестандартное
использование препроцессора поделитесь, пожалуйста, ссылками.
А то в тех страницах что находит гугл нестандартное использование
дальше чем #if 0 ... #endif для комментариев не заходит.

anonymous

Только вторая форма: Си - это не Lisp.

А нестандартно препроцессор лучше не использовать - пожалей коллег. В Си++ использования препроцессора часто можно избежать с помощью трюков с шаблонами (почитай Александреску).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> А нестандартно препроцессор лучше не использовать - пожалей коллег.
Не, это только для себя

> использования препроцессора часто можно избежать с помощью трюков с шаблонами
Policies and strategies? Это точно, но в этом конкретном примере ...

Насчет извратов с CPP - нашел boost::preprocessor.
Сижу ломаю голову :-)

anonymous
()
Ответ на: комментарий от anonymous

boost::preprocessor? okay лови:

#include <typeinfo>
#include <iostream>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/tuple/elem.hpp>

#define MY_PP_DEFINE_TYPEARRAY(name,tuple) \
	const std::type_info* types_for_##name[] = { \
        BOOST_PP_SEQ_FOR_EACH_I(MY_PP_DEFINE_TYPEARRAY_II, 0, BOOST_PP_TUPLE_ELEM(1,0,tuple)) \
	}; \
/***/

#define MY_PP_DEFINE_TYPEARRAY_II(r, aux, i, item) \
    BOOST_PP_COMMA_IF(i) &typeid(item) \
/***/

MY_PP_DEFINE_TYPEARRAY(test,((int)(float)(char))) 

#undef MY_PP_DEFINE_TYPEARRAY_II
#undef MY_PP_DEFINE_TYPEARRAY

int main()
{
	using namespace std;
	cout << types_for_test[0] << endl;
	cout << types_for_test[1] << endl;
	cout << types_for_test[2] << endl;
}

aton
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.