Вопрос
Я пытаюсь написать макрос C++, который будет принимать либо type
, либо type name
в качестве входных данных и давать type
в качестве выходных данных.
Например:REMOVE_NAME(int)
должно быть int
REMOVE_NAME(int aNumber)
также должно быть int
Мне удалось написать такой макрос (ниже), и он работает, но мне интересно, не упустил ли я более простой способ сделать это.
#include <boost/type_traits.hpp>
template <typename T>
struct RemoveNameVoidHelper
{
typedef typename T::arg1_type type;
};
template <>
struct RemoveNameVoidHelper<boost::function_traits<void()>>
{
typedef void type;
};
#define REMOVE_NAME(expr) RemoveNameVoidHelper<boost::function_traits<void(expr)>>::type
Любые идеи?
Мотивация
Я использую этот макрос, чтобы помочь с генерацией кода. У меня есть еще один макрос, который используется для объявления определенных методов в определениях классов:
#define SLOT(name, type) \
void Slot##name(REMOVE_NAME(type) argument) \
{ \
/* Something that uses the argument. */ \
} \
void name(type)
Я хочу, чтобы пользователь макроса SLOT
мог удобно выбирать, хочет ли он реализовать свои слоты внутри или вне класса, как и в случае с обычными методами. Это означает, что аргумент типа SLOT
может быть либо типом, либо типом с именем. Например:
class SomeClass
{
SLOT(ImplementedElsewhere, int);
SLOT(ImplementedHere, int aNumber)
{
/* Something that uses aNumber. */
}
};
Без макроса REMOVE_NAME
мой автоматически сгенерированный метод Slot...
не сможет указать собственное имя для своего аргумента и, следовательно, не сможет ссылаться на него.
Конечно, это не единственное возможное использование этого макроса.
decltype
. - person Some programmer dude   schedule 03.09.2012decltype(int aNumber)
является незаконным, к сожалению. - person Corvus Corax   schedule 03.09.2012ImplementedHere
идет под строкойvoid ImplementedHere(int aNumber)
. Жестко заданное имяargument
используется только в сгенерированной макросом функцииvoid SlotImplementedHere(int argument)
, о которой пользователь библиотеки ничего не знает. Я должен использовать там жестко заданное имя, иначе реализацияAsyncImplementedHere
(которая тоже генерируется тут же в макросе) не сможет ссылаться на собственный параметр. - person Corvus Corax   schedule 03.09.2012SLOT
действительно является вариативным (здесь не показан), и когда пользователи реализуют свой слот, они указывают полные аргументы. Вот почему реализацияImplementedHere
может относиться кaNumber
. - person Corvus Corax   schedule 03.09.2012