是否可以创建一个仅接受字符串文字但不接受 eg的构造函数(或函数签名) char const *
?
是否有可能有两个可以区分字符串文字和的重载char const *
?
C++ 0x 会允许使用自定义后缀来实现这一点——但我正在寻找一个“早期”的解决方案。
基本原理:避免作为字符串文字给出时不会被修改的字符串的堆副本。
这些字符串直接发送到 API,const char *
不需要任何处理。大多数调用确实使用不需要额外处理的文字,仅在少数情况下它们是构造的。我正在寻找一种保留本机调用行为的可能性。
注意: - 因为它出现在答案中:有问题的代码根本不使用std::string
,但一个很好的例子是:
class foo
{
std::string m_str;
char const * m_cstr;
public:
foo(<string literal> s) : m_cstr(p) {}
foo(char const * s) : m_str(s) { m_cstr = s.c_str(); }
foo(std::string const & s) : m_str(s) { m_cstr = s.c_str(); }
operator char const *() const { return m_cstr; }
}
结果:
(1) 做不到。
(2) 我意识到我什至不是在寻找文字,而是在寻找编译时间常数(即“任何不需要复制的东西”)。
我可能会改用以下模式:
const literal str_Ophelia = "Ophelia";
void Foo()
{
Hamlet(str_Ophelia, ...); // can receive literal or string or const char *
}
用一个简单的
struct literal
{
char const * data;
literal(char const * p) : data(p) {}
operator const char *() const { return data; }
};
这并不能阻止任何人滥用它(我应该找到一个更好的名字......),但它允许所需的优化,但默认情况下保持安全。