【发布时间】:2021-07-25 01:49:09
【问题描述】:
我想将我的用户定义概念用作 std::span 的模板类型,但模板参数推导无法按预期工作。当我尝试将“char”的“std::array”传递给模板函数时;编译器显示错误“error: no matching function for call to 'print'”并在我将鼠标悬停在模板定义上时警告我作为 ”注意:候选模板被忽略:无法匹配'span' 对 'array'".
这里是概念定义和函数模板:
#include <concepts>
#include <span>
template <typename T>
concept OneByteData = sizeof(T) == 1;
template<OneByteData T>
void print(std::span<const T> container)
{
for(auto element : container)
{
//Do Some Work
}
}
而且用户代码没有按我的预期工作:
int main()
{
std::array<char, 6> arr = {1, 2, 3, 4, 5, 6};
print(arr);
return 0;
}
有效且不产生错误的用户代码:
int main()
{
std::array<char, 6> arr = {1, 2, 3, 4, 5, 6};
print<char>(arr);
return 0;
}
有没有办法在不专门指定数组类型的情况下调用这个模板函数。我应该如何更改模板函数定义以使函数按照我提到的方式调用(@987654326@)?
编辑: 我希望能够利用 std::span 的优势,并能够使用 std::array、std::vector 和纯 C 样式调用模板函数数组。
【问题讨论】:
标签: c++ templates c++20 c++-concepts std-span