我正在尝试编写一个C ++宏,它将 type
或 type name
作为输入,并提供 {{ 1}} 作为输出。
例如:
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
方法将无法为其参数指定自己的名称,因此无法引用它。
当然,这不是这个宏的唯一可能用途。
答案 0 :(得分:2)
我认为你是对的;据我所知,只有 decl-specifier-seq 或 type-specifier-seq 后面跟一个可选的声明符的其他产品是一个catch
声明,我并不认为它可以用于类型提取。生产参数声明也用于 template-parameter-list ,但这两者都没有用。
我可能会像这样定义你的宏,删除对Boost的依赖:
template<typename T> struct remove_name_helper {};
template<typename T> struct remove_name_helper<void(T)> { typedef T type; };
template<> struct remove_name_helper<void()> { typedef void type; };
#define REMOVE_NAME(expr) typename remove_name_helper<void(expr)>>::type