宏来获取表达式的类型

时间:2012-09-03 13:20:01

标签: c++ templates types macros typetraits

问题

我正在尝试编写一个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方法将无法为其参数指定自己的名称,因此无法引用它。

当然,这不是这个宏的唯一可能用途。

1 个答案:

答案 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