我想将我的用户定义概念用作 std::span 的模板类型,但模板参数推导无法按预期工作。当我尝试将“ std::array
of char
”传递给模板函数时;编译器显示错误“ 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;
}
有没有办法在不专门指定数组类型的情况下调用这个模板函数。我应该如何更改模板函数定义以使函数以我提到的方式调用 ( print(arr)
) ?
编辑:我希望能够使用 std::span 的好处,并能够使用 std::array、std::vector 和纯 C 样式数组调用模板函数。