【发布时间】:2020-03-09 11:24:31
【问题描述】:
我有一个函数模板,它接受一个任意嵌套的列表并返回一个数组:
#include <array>
#include <initializer_list>
template<size_t N, typename List>
std::array<size_t,N> some_function (const List& list)
{
// N is the number of times the list is nested.
std::array<size_t,N> arr;
return arr;
}
当我将这个函数用于一些嵌套的std::initializer_list时,像这样:
int main () {
using List = std::initializer_list<std::initializer_list<double>>;
List list = {{1.,2.,3.},{4.,5.,6.}};
std::array<size_t,2> arr;
arr = some_function (list);
return 0;
}
收到无法推断类型N的错误
无法推断出模板参数‘N’
问题
- 如何改进函数模板以推断列表嵌套的次数?
- 对于这种情况,有没有比
std::initializer_list更好的替代方案?
【问题讨论】:
-
你认为
arr在arr = some_function (list);之后会是什么。std::array中的N是数组的大小。 -
另外,您使用的
std::array的值类型为std::size_t,但您的列表包含双精度值。请澄清您的问题。 -
据我了解,赋值
arr = some_function (list)不用于类型推断。所以只使用some_function (list)。但是编译器没有办法知道数组的大小。 -
initializer_list 的大小在编译时是未知的。见:stackoverflow.com/questions/41311023/…
-
您是否要从
{{1.,2.,3.},{4.,5.,6.}}获取{ 2, 3 }? IE。每个维度的大小?
标签: c++ c++11 templates stdinitializerlist