【发布时间】:2014-12-21 15:36:57
【问题描述】:
我正在尝试创建一个类,该类将接受(并且可以消除歧义)来自 char 指针的字符串文字。在搜索这个问题时,提供的解决方案是创建一个只接受字符指针的“持有人”类:
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;
}
这只是一个简单的毫无意义的例子;在我的真实代码中,我创建了一个保存字符串哈希的类。
如果传递的是字符串字面量,则应在编译时生成哈希值,如果传递的是字符指针,则应在运行时计算。
然而,这对于只传递字符串的用户来说应该是完全透明的,散列是自动完成的。
【问题讨论】:
-
指针不是数组!
-
第二个构造函数接受 holder_t 参数,该参数可以从 char 指针隐式构造。如果我显式创建实例,这很好用,我只是希望它隐式发生。
-
@sliser 字符串文字是一个数组。
-
@sliser:有人说或暗示它在哪里?
标签: c++