【发布时间】:2016-05-08 09:59:47
【问题描述】:
所以我试图用可变参数模板替换多个相似的成员函数,因为这些函数都做同样的事情并将它们的一些参数转发给不同的函数。我试图替换这两个函数:
void function(T a, T b, double c, bool d = false)
{
if (!isStateMemoryFixed) isStateMemoryFixed = true;
helper.help(a, b, c);
if (d) doStuff();
}
void function(T a, T b, T e, double c, bool d = false)
{
if (!isStateMemoryFixed) isStateMemoryFixed = true;
helper.help(a, b, e, c);
if (d) doStuff();
}
有了这个
template<typename... Ts>
void function(Ts... ts, bool d= false)
{
if (!isStateMemoryFixed) isStateMemoryFixed = true;
helper.help(ts...);
if (d) doStuff();
}
并像以前一样调用它:
void test()
{
T a,b,e;
double c;
Obj obj;
obj.function(a,b,e,c,true);
}
但我得到一个错误:“没有模板实例...匹配参数列表”。 我是可变参数模板的新手,但我一直在阅读的内容表明我应该能够做到这一点。
【问题讨论】:
-
Ts...将保持为空,因为它不是最后一个参数时无法自动确定。如此有效地调用一个只有bool参数的函数,因此会出现错误消息。 -
换句话说,编译器如何知道
true何时是ts的一部分,何时它是d的非默认值?所以规则是可变参数位于参数列表的末尾(不幸的是,这与d的默认值冲突)。 -
[OT]:
if (!isStateMemoryFixed) isStateMemoryFixed = true;应该被isStateMemoryFixed = true;替换。 -
T是什么类型?因为如果可以从int转换,function(1,1,1,1)应该在您更改之前调用什么? -
对不起...您对我的答案的更正是正确的...我错误地拒绝了它。
标签: c++ templates variadic-templates