文字列リテラルのみを受け入れ、 eg を受け入れないコンストラクター (または関数シグネチャー) を作成することは可能char const *
ですか?
文字列リテラルと を区別できる 2 つのオーバーロードを持つことは可能char const *
ですか?
C++ 0x は、カスタム サフィックスを使用してこれを許可しますが、「以前の」ソリューションを探しています。
理由:文字列リテラルとして指定された場合に変更されない文字列のヒープ コピーを回避します。
const char *
これらの文字列は、処理なしで API に直接送信されます。ほとんどの呼び出しは、追加の処理を必要としないリテラルを使用しますが、構築されるのはごくわずかです。ネイティブの通話動作を維持する可能性を探しています。
注: -回答に出てくるので、問題のコードはまったく使用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; }
};
誰かがそれを悪用するのを止めるわけではありませんが (もっと良い名前を見つける必要があります...)、必要な最適化を可能にしますが、デフォルトで安全なままです。