我遇到了一个有趣的挑战,我已经尝试解决几个小时了,但是经过多次研究和尝试失败后,我发现自己问了这个问题。
我想编写3个重载函数,每个函数分别接受以下类型之一:
下面的两个函数能够通过包装类CharPtrWrapper区分前两种类型(
现在,如果我使用字符串字面量调用
这就是问题的关键所在。我一直没有能够编写出一个能够区分char数组和字符串字面量的函数。我想可能会有一个方案,就是编写一个接收rvalue引用的版本:
但事实上,字符串字面值是左值。我也尝试了使用std :: enable_if和std :: is_array的不同版本,但仍然没有得到我想要的结果。
因此,我的问题是:在现代C ++中,是否有可能区分char数组和字符串字面值?
我想编写3个重载函数,每个函数分别接受以下类型之一:
const char*
,const char(&)[N]
和 字符串字面量(例如"BOO")
。 我知道字符串字面量只是一个char数组,但是请容许我解释我的方法。下面的两个函数能够通过包装类CharPtrWrapper区分前两种类型(
const char*
和 const char(&)[N]
):#include <iostream>
class CharPtrWrapper
{
public:
CharPtrWrapper(const char* charPtr)
: m_charPtr(charPtr)
{
}
const char * m_charPtr;
};
void processStr(CharPtrWrapper charPtrWrapper)
{
std::cout << "From function that takes a CharPtrWrapper = " << charPtrWrapper.m_charPtr << '\n';
}
template<std::size_t N>
void processStr(const char (&charArr)[N])
{
std::cout << "From function that takes a \"const char(&)[N]\" = " << charArr << '\n';
}
int main()
{
const char* charPtr = "ABC";
processStr(charPtr);
const char charArr[] = {'X', 'Y', 'Z', '\0'};
processStr(charArr);
}
输出:
From function that takes a CharPtrWrapper = ABC
From function that takes a "const char(&)[N]" = XYZ
现在,如果我使用字符串字面量调用
processStr
(例如processStr("BOO")
),将调用接受const char(&)[N]
的版本,这是有道理的,因为字符串字面量只是一个char数组。这就是问题的关键所在。我一直没有能够编写出一个能够区分char数组和字符串字面量的函数。我想可能会有一个方案,就是编写一个接收rvalue引用的版本:
template<std::size_t N>
void processStr(const char (&&charArr)[N])
{
std::cout << "From function that takes a \"const char(&&)[N]\" = " << charArr << '\n';
}
但事实上,字符串字面值是左值。我也尝试了使用std :: enable_if和std :: is_array的不同版本,但仍然没有得到我想要的结果。
因此,我的问题是:在现代C ++中,是否有可能区分char数组和字符串字面值?
char *
之间有什么重要的区别? - user10957435consteval
来实现你的实际目标,但我认为仅使用C++17是没有办法的。 - Miles Budnek