gpt4 book ai didi

c++ - 函数模板中的数组值类型推导

转载 作者:行者123 更新时间:2023-11-30 03:20:14 26 4
gpt4 key购买 nike

我对以下代码片段有以下担忧:

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 有什么特别之处可以在上述上下文中推导出来?

提前谢谢你。

最佳答案

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

至于为什么它在常规 C 风格数组引用的情况下起作用,这是因为为它们和 std::initializer_list 明确设置了一个异常(exception)。参数。所有这些都在同一个标​​准段落中进行了描述:

[temp.deduct.call]

1 Template argument deduction is done by comparing each function template parameter type (call it P) that contains template-parameters that participate in template argument deduction with the type of the corresponding argument of the call (call it A) as described below. If removing references and cv-qualifiers from P gives std​::​initializer_­list<P'> or P'[N] for some P' and N and the argument is a non-empty initializer list ([dcl.init.list]), then deduction is performed instead for each element of the initializer list, taking P' as a function template parameter type and the initializer element as its argument, and in the P'[N] case, if N is a non-type template parameter, N is deduced from the length of the initializer list. Otherwise, an initializer list argument causes the parameter to be considered a non-deduced context ([temp.deduct.type]).

关于c++ - 函数模板中的数组值类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52983088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com