【问题标题】:Template deduction fails with argument after parameter pack模板推导失败,参数包后带参数
【发布时间】:2015-09-18 21:10:30
【问题描述】:

我有这个功能:

template <typename... Args>
void f(Args... args, int last)
{
}

如果我在没有显式模板参数的情况下调用模板推导失败:

f(2, 2); // candidate expects 1 argument, 2 provided

但是为参数包提供显式模板参数是可行的:

f<int>(2, 2); // compiles fine

尽管从逻辑上讲,编译器应该能够推断出参数包由除最后一个参数类型之外的所有类型组成。我该如何解决这个问题?

【问题讨论】:

    标签: c++ templates c++11 template-argument-deduction


    【解决方案1】:

    [temp.deduct.type]/p5:

    未推断的上下文是:

    • [...]
    • 不出现在parameter-declaration-list末尾的函数参数包。

    要扣除,你必须这样做

    template <typename... Args>
    void f(Args... args)
    {
    }
    

    并切掉正文中的最后一个参数,或者改为 last first

    template <typename... Args>
    void f(int first, Args... args)
    {
    }
    

    很难给出更具体的建议,因为我们不知道这个函数模板应该做什么。

    【讨论】:

    • 如何最容易地切掉最后一个参数,而不是将所有内容打包成一个元组,然后按索引解包?
    • 如果您有新问题,请提出新问题。
    【解决方案2】:

    来自[temp.deduct.type]:

    未推断的上下文是:
    [...] — 一个不出现在 parameter-declaration-list 末尾的函数参数包。

    您的参数包args 是一个非推断上下文,因为它不是最后一个参数。顾名思义,非推导上下文无法推导 - 这会导致模板推导失败。

    当您显式提供模板参数时(通过f&lt;int&gt;(2, 2)),不必进行推导,因此代码没问题,您只需显式调用f&lt;int&gt;(int, int)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      相关资源
      最近更新 更多