【问题标题】:Array value type deduction in a function template函数模板中的数组值类型推导
【发布时间】:2018-10-25 06:52:09
【问题描述】:

我对以下代码 sn-p 有以下担忧:

template<std::size_t Dim, std::size_t N,
  typename RangeType1, typename RangeType2>
void multilinear_interp(
  const RangeType1 (&coordsFrom)[Dim],
  const std::array<RangeType2, N>& field)
{
   // do something
}

int main()
{ 
    std::vector<double> x{}, y{};
    std::vector<float> f0{}, f1{};

    multilinear_interp<2, 2>({x, y}, {f0, f1});
}

看起来编译器可以推断 RangeType1,但无法推断 RangeType2,编译失败。是否有可能在不明确指定 multiliner_interp 的所有模板参数的情况下使用 std::array ?如果不是,那么 const T (&)[Dim] w.r.t std::array 有什么特别之处可以在上述上下文中推导出来?

提前谢谢你。

【问题讨论】:

  • 您得到的确切错误是什么?请将编译器的完整和完整(包括可能的信息注释)输出复制粘贴(作为文本)到问题正文中。
  • 错误:没有匹配函数调用 'multilinear_interp(, )' multilinear_interp({x , y}, {f0, f1});

标签: c++ templates


【解决方案1】:

是的,没有从 {f0, f1} 甚至 {{f0, f1}} 推导出像 std::array 这样的容器(如果一个人最初的想法是括号省略)。原因是大括号括起来的初始值设定项不是表达式。它没有从 推断的类型。所以它通常被归类为非推导上下文(即不能从中推导出模板参数)。

至于为什么它在常规 C 样式数组引用的情况下有效,这是因为它们和std::initializer_list 参数显式地产生了异常。所有这些都在同一个标​​准段落中描述:

[temp.deduct.call]

1模板参数推导是通过比较每个函数来完成的 包含 template-parameters 的模板参数类型(称为 P) 参与模板参数推导的类型为 调用的相应参数(称为A),如下所述。如果 从P 中删除引用和 cv 限定符给出 std​::​initializer_­list&lt;P'&gt;P'[N] 对于某些 P'N 和 参数是一个非空初始化列表([dcl.init.list]),然后 而是为初始化程序的每个元素执行推导 列表,将P' 作为函数模板参数类型, 初始化器元素作为其参数,在 P'[N] 的情况下,如果 N 是 非类型模板参数,N 是从长度推导出来的 初始化列表。否则,初始化列表参数会导致 参数被视为非推导上下文 ([temp.deduct.type])。

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多