我怎样才能有默认参数的效果与可变模板

How can I have the effect of default parameter with variadic template

本文关键字:参数 默认      更新时间:2023-10-16

我遇到这个问题有一段时间了,我不知道如何解决它。上下文是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;
因此

是无效的

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

谁有解决这个问题的方法?

谢谢

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

#define MACRO(arg, ...) foo(arg, ##__VA_ARGS__)
这个exapands

:

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

你可以在你的DEFINE_METACLASS宏中使用它来一次覆盖所有的情况。

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