C++ 使用数组类型的模板重载:强制char数组使用string\u视图

C++ 使用数组类型的模板重载:强制char数组使用string\u视图,c++,c++17,C++,C++17,我有一个print()template方法重载以处理不同的类型。我关注的有三类: 不包括文字字符串的标量值的数组类型(例如无符号foo[5]) 字符串文字(例如,“Hello World”) 字符串类型(char const*和std::String) 第一项的处理方式应不同于字符串(最后2点)。下面是我编写的一些代码,试图区分它们(): 模板 无效打印(T常量&) { std::cout数组模板更适合char[]类型,因为string\u视图版本涉及用户定义的转换 您可以使用SFINAE禁

我有一个
print()
template方法重载以处理不同的类型。我关注的有三类:

  • 不包括文字字符串的标量值的数组类型(例如
    无符号foo[5]
  • 字符串文字(例如,
    “Hello World”
  • 字符串类型(
    char const*
    std::String
第一项的处理方式应不同于字符串(最后2点)。下面是我编写的一些代码,试图区分它们():

模板
无效打印(T常量&)
{

std::cout数组模板更适合
char[]
类型,因为
string\u视图
版本涉及用户定义的转换

您可以使用SFINAE禁用
char[]
类型的数组版本:

template<typename Container, typename Array, std::size_t Size,
    std::enable_if_t<!std::is_same_v<Array, char>, int> = 0>
void print(Array const (&)[Size])
{
    std::cout << "Array\n";
}
template=0>
无效打印(数组常量(&)[大小])
{

std::cout由于字符串文本是左值
const char[N]
,因此它无法在
数组const(&)[Size]
上选择
std::string\u视图
。必须禁用char的数组重载:

模板
std::如果启用,则启用
template<typename Container, typename Array, std::size_t Size,
    std::enable_if_t<!std::is_same_v<Array, char>, int> = 0>
void print(Array const (&)[Size])
{
    std::cout << "Array\n";
}
template<typename Container, std::size_t Size>
void print(char const (&s)[Size])
{
    print<Container>(std::string_view(s));
}
char value[] = { 1 };  // Not null terminated
print<int>(value);  // Constructing a string_view from non-null terminated array