【问题标题】:C++ variadic template function with non-template具有非模板的 C++ 可变参数模板函数
【发布时间】: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


【解决方案1】:

正如 Johannes Schaub 和 Bo Persson 所说,可变参数必须位于列表的末尾。

因此,恕我直言,可以用这种方式重写函数(假设c 参数是强制性的,甚至是double 类型),一个优于无的解决方案(注意:未测试)。

template<typename... Ts>
void function(double c, bool d, Ts... ts)
{
        if (!isStateMemoryFixed) isStateMemoryFixed = true;
        helper.help(c, ts...);
        if (d) doStuff();
}

这不等效:您失去了 d 的默认 false 值。

通话变成

function(c, true, a, b, e);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多