Cor*_*rax 9 c++ macros templates types type-traits
我正在尝试编写一个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
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在使用这个宏来帮助代码生成.我有另一个宏用于声明类定义中的某些方法:
#define SLOT(name, type) \
void Slot##name(REMOVE_NAME(type) argument) \
{ \
/* Something that uses the argument. */ \
} \
void name(type)
Run Code Online (Sandbox Code Playgroud)
我希望SLOT
宏的用户能够轻松地选择是否要在类内部或外部实现他的插槽,就像使用普通方法一样.这意味着SLOT
类型参数可以是类型,也可以是具有名称的类型.例如:
class SomeClass
{
SLOT(ImplementedElsewhere, int);
SLOT(ImplementedHere, int aNumber)
{
/* Something that uses aNumber. */
}
};
Run Code Online (Sandbox Code Playgroud)
没有REMOVE_NAME
宏,我自动生成的Slot...
方法将无法为其参数指定自己的名称,因此它将无法引用它.
当然,这不是这个宏的唯一可能用途.
我认为你是对的;据我所知,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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
475 次 |
最近记录: |