gpt4 book ai didi

c++ - 重载 char 指针和字符串文字

转载 作者:行者123 更新时间:2023-11-30 03:58:09 25 4
gpt4 key购买 nike

我正在尝试创建一个类,它将接受(并且可以消除歧义)来自 char 指针的字符串文字。在搜索这个问题时,提供的解决方案是创建一个只接受 char 指针的“holder”类:

template< typename char_t >
class String
{
struct holder_t
{
const char_t* s;
holder_t( const char_t* s ) : s(s) {}
holder_t( char_t* s ) : s(s) {}
};
public:

// Construct from string literal
template< size_t S >
String( const char_t (&str)[S] )
{
std::cout << "String Literal: " << str;
}

// Construct from char pointer
String( holder_t h )
{
std::cout << "Char Pointer: " << h.s;
}
};

主要的想法是你永远不必显式地创建这个类的实例,它应该通过隐式转换来实现:

void StringFoo( String<char> s )
{
}

但是这会导致 char 指针的编译错误,为什么隐式转换不起作用?

int main()
{
// Works!
StringFoo( "literal" );

// error C2664: 'StringFoo' : cannot convert parameter 1 from 'const char *' to 'String<char_t>'
// with [ char_t=char ]
// No constructor could take the source type, or constructor overload resolution was ambiguous
StringFoo( (const char*)"const char ptr" );

// Works!
StringFoo( String<char>((const char*)"const char ptr") );

// error C2664: 'StringFoo' : cannot convert parameter 1 from 'char *' to 'String<char_t>'
// with [ char_t=char ]
// No constructor could take the source type, or constructor overload resolution was ambiguous
StringFoo( (char*)"char ptr" );

// Works!
StringFoo( String<char>((char*)"const char ptr") );

return 0;
}

这只是一个简单的无意义的例子;在我的真实代码中,我创建了一个类来保存字符串的哈希值。

如果传递的是字符串文字,则应在编译时生成散列,如果传递的是字符指针,则应在运行时计算散列。

然而,这对只是传递字符串的用户来说应该是完全透明的,散列是自动完成的。

最佳答案

代码不适用于指针的原因是它需要两个版本(char const*holderholderString。但是,隐式转换最多只进行一次转换。

为了您所描述的目的,我认为您可以合理地区分 char const(&)[N]char const*:因为您总是想要无论如何都要计算一个散列,并尽可能将其设为 constexpr,使采用 char const(&)[N] 引用的版本应该可以解决问题。

关于c++ - 重载 char 指针和字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27590878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com