Jos*_*ler 2 c++ templates initializer-list
我有一个模板化函数,它以std::array任意大小作为参数。它看起来大致是这样的:
template <size_t n>
void foo(const std::array<int, n>& numbers) {
for (const auto & number: numbers) {
// ... do stuff ...
}
}
Run Code Online (Sandbox Code Playgroud)
我可以这样称呼它:
std::array<int, 2> ints = {4, 5};
foo(ints);
Run Code Online (Sandbox Code Playgroud)
一切都很好。
不幸的是,我无法使用初始化列表直接调用该函数。这段代码:
foo({4, 5});
Run Code Online (Sandbox Code Playgroud)
给了我以下错误:
错误:没有匹配的成员函数来调用“foo” 注意:候选模板被忽略:无法推断模板参数“n”
有没有办法使用初始化列表或类似的东西使我的函数工作?
{/*..*/}没有类型,因此除了std::initializer_list<T>C-arrays之外,不能在模板函数中推导出来T (&a)[N]。
所以你必须
将重载添加到句柄std::initializer_list<int>或 C 数组。
// span (C++20) has constructor from std::array :)
void foo(const std::span<int>& numbers) {
for (const auto & number: numbers) {
// ... do stuff ...
}
}
void foo(std::initializer_list<int> numbers) {
foo(std::span{numbers.begin(), numbers.size()});
}
Run Code Online (Sandbox Code Playgroud)或提供非推导模板参数: foo<2>({4, 5});
或提供类型{}(使用 C++17 的 CTAD 更容易):foo(std::array{4, 5});