C++ 使用constexpr、SFINAE和/或type_特性对char*、char数组和字符串文本进行重载解析
我遇到了一个有趣的挑战,几个小时来我一直在努力解决这个问题,但经过大量的研究和多次失败的尝试,我发现自己在问这个问题 我想编写3个重载函数,每个重载函数采用以下类型之一:C++ 使用constexpr、SFINAE和/或type_特性对char*、char数组和字符串文本进行重载解析,c++,overloading,sfinae,typetraits,enable-if,C++,Overloading,Sfinae,Typetraits,Enable If,我遇到了一个有趣的挑战,几个小时来我一直在努力解决这个问题,但经过大量的研究和多次失败的尝试,我发现自己在问这个问题 我想编写3个重载函数,每个重载函数采用以下类型之一:constchar*、constchar(&)[N]和字符串文字(例如“BOO”)。我知道字符串文字只是一个字符数组,但请耐心听我解释我的方法 由于包装器类charptrRapper,下面的两个函数能够区分前两种类型(const char*和const char(&)[N]): #包括 类CharptrRapper { 公众:
constchar*
、constchar(&)[N]
和字符串文字(例如“BOO”)
。我知道字符串文字只是一个字符数组,但请耐心听我解释我的方法
由于包装器类charptrRapper
,下面的两个函数能够区分前两种类型(const char*
和const char(&)[N]
):
#包括
类CharptrRapper
{
公众:
CharptrRapper(常量字符*charPtr)
:m_charPtr(charPtr)
{
}
const char*m_charPtr;
};
void processStr(CharPtrWrapper CharPtrWrapper)
{
标准::coutPer:
[…]表达式的类型是标识符的类型
结果是由标识符表示的实体
如果实体是函数、变量或数据成员且为
否则为prvalue;如果标识符指定
位字段([dcl.struct.bind])
因此,给出了一个声明
const char arr[] = "foo";
表达式arr
是const char[4]
类型的左值
Per:
还引用了普通字符串文字和UTF-8字符串文字
将作为窄字符串文字。窄字符串文字的类型为“array”
of nconst char
”,其中n是定义的字符串大小
下,并具有静态存储持续时间
及
文字是主表达式。其类型取决于其形式。A
字符串文字是左值;所有其他文字都是prvalues
因此,表达式“foo”
是const char[4]
类型的左值
结论:函数无法区分a(const)字符数组和字符串文字。为什么?为什么?你需要这个吗?为什么你需要区分这两个?我甚至不认为这是可能的,但是再一次,字符串文字与char*
s相比,什么是重要的?请看我昨天提出的问题,以了解我为什么需要这个。我想改进一个开源库。我还没有得到能够编写能够区分字符数组和字符串文字的函数字符串文字是字符数组。它们的类型完全相同,因此您无法区分它们。它甚至是左值,因此您无法基于左值/右值进行区分。您可以使用C++20,但我认为没有办法只使用C++17。谢谢你的回答@L.F.!我很失望这是不可能的,因为我觉得我发现了一种情况,在这种情况下,如果是这样的话会非常有益。
const char arr[] = "foo";