0

我现在遇到这个问题有一段时间了,我不知道如何解决它。上下文是 C++ 中的反射系统。这个问题的一个瘦身解释是这样的。我有这两个结构。一种是表示 ClassType 类型的多个父类,另一种是表示孤儿类(ClassType 类型且没有父类的类)

template<typename ClassType, typename... ParentTypeList>
struct Parents 
{
};

template<typename ClassType>
struct Parents<ClassType>
{        
};

然后在我要反映的类的声明中,我使用这个宏,类 ReflectionHelper::Parents 是上面的类

#define DEFINE_METACLASS(className, ...) \
private: \
typedef className SelfType; \
typedef ReflectionHelper::Parents<SelfType, __VA_ARGS__ > ParentList \

孤儿类的用法是:

class TestMetaClassDefine
{
DEFINE_METACLASS(TestMetaClassDefine);     
};

现在的问题是 __VA_ARGS__ 是空的,而

typedef ReflectionHelper::Parents<SelfType, __VA_ARGS__ > ParentList;

因此无效。

我想解决这个问题的一种方法是使用默认模板参数,但它不允许使用可变参数模板。

有人有解决这个问题的技术吗?

非常感谢

4

1 回答 1

1

如果列表为空,GCC 预处理器允许使用特殊语法省略可变参数宏参数列表中的最后一个逗号:

#define MACRO(arg, ...) foo(arg, ##__VA_ARGS__)

这扩展了:

MACRO(a,b)   ->  foo(a, b)
MACRO(a)     ->  foo(a )

您可以将它用于您的DEFINE_METACLASS宏以一次涵盖所有情况。

更新:正如@Dennis 所说,您可以在 MSVC++ 中使用原始语法,它甚至不会产生尾随逗号。

于 2011-07-27T19:56:57.550 回答