我正在尝试编写一个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 …Run Code Online (Sandbox Code Playgroud) 假设我正在编写一个表示数学对象的类,为此定义各种标准操作是有意义的。
通过重载算术运算符,我可以享受一个事实,即使用给定的类时,使用它们的任何模板化算法都可以按预期工作。但是,如果算法使用类似std :: pow之类的东西怎么办?
该标准似乎声明仅允许std名称空间中的函数的模板专业化,这意味着不允许我为自己的类编写自己的std :: pow重载。但是,如果确实如此,那么确保通用性的最佳方法是什么?