宏得到一个表达式的类型(Macro to get the type of an expression

2019-09-22 02:53发布

我试图写一个C ++宏,将采取两种typetype 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...方法就不能为它的参数指定了自己的名字,因此将无法参考。

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

Answer 1:

我认为你是正确的; 据我可以告诉只等生产,其中一个DECL说明符-SEQ类型说明符-SEQ后面跟着一个可选的声明符catch声明,我不认为这是对类型提取多大用处。 生产参数声明也被用在模板参数列表 ,但是这没有多大用处无论是。

我可能会宏这样,取消对提振依赖性:

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


文章来源: Macro to get the type of an expression