我怎样才能有默认参数的效果与可变模板
How can I have the effect of default parameter with variadic template
我遇到这个问题有一段时间了,我不知道如何解决它。上下文是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++中使用原始语法,它甚至不会产生尾随逗号。
相关文章:
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本