如何使用variadic模板获得默认参数的效果

时间:2011-07-27 19:48:57

标签: c++ c++11 variadic-templates

我现在遇到这个问题一段时间了,我无法弄清楚如何解决它。上下文是c ++中的反射系统。这个问题的细微解释就是这个问题。我有这两个结构。一种是表示ClassType类型的多个父类,另一个代表Orphan类(一类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;
因此

无效。

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

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

非常感谢

1 个答案:

答案 0 :(得分:1)

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

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

这个改编:

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

您可以将此DEFINE_METACLASS宏用于同时涵盖所有案例。

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