編集済み - 実際の問題がある編集にスキップしてください
スタンドアロン関数の文字列ヘルパー ライブラリで、 を受け取るバージョンと . を受け取るバージョンで関数のオーバーロードを提供する状況によく遭遇しchar
ますstd::string
。
問題は、文字列リテラル ( ) を渡すとオーバーロードがあいまいになることconst char*
です。
例:
void myFunc(const std::string &subStr);
void myFunc(char character);
これら 2 つの関数は異なる方法で実装されており、1 つは文字列用に最適化され、もう 1 つは単一の文字用に最適化されています。myFunc("literal")
ただし、常にバージョンを呼び出したいと思っていたにもかかわらず、呼び出そうとするとあいまいな結果になりstd::string
ます。
これvoid myFunc(const char *str)
により、次のようなスタブのみであるオーバーロードのバージョンを提供する必要があります。
void myFunc(const char *str)
{
myFunc(std::string(str));
}
これらのスタブ関数を不要にする方法はありますか? 「明示的」にできるようにしたいvoid myFunc(char c)
のですが、コンストラクター以外の非メンバー関数を明示的にすることはできません。これは問題を即座に解決します。=(...
(余談ですが、スタンドアロン関数を明示的にできないのはなぜですか?)
編集: プログラマーが夜遅くまでコーディングしすぎることについて彼らが言っていることをご存知でしょう! (冗談を覚えているなら教えてください。最初に聞いたときは眠すぎて忘れてしまったからです)
本当の問題
私はMinGW v4.7.2を使用していますが、問題は私の投稿が当初想定していたものとは大きく異なりました。
問題は、いくつかのオーバーロードがあることです。はい、この例は正常に動作します:
void myFunc(const std::string &subStr);
void myFunc(char character);
しかし、std::function オーバーロードを追加すると、次のように壊れます。
void myFunc(const std::string &subStr);
//Not actually part of the problem; I was confused by part of the error message highlighting this function.
//void myFunc(char character);
void myFunc(std::function<bool(char)); //<-- The real problem
私の文字列ライブラリには、std::string、char、および std::function のオーバーロードがあります (場合によっては、多数のオプション パラメーターを使用して関数を単純化するためのオーバーロードがさらにいくつかあります)。
std::function をオーバーロードとして使用すると、次のエラー メッセージが表示されます。
error: call of overloaded ‘myFunc(const char [15])’ is ambiguous
candidates are:
void myFunc(char) <near match>
no known conversion for argument 1 from ‘const char [15]’ to ‘char’
void myFunc(std::function<bool(char)>)
void myFunc(const string&)
myFunc(char) は、私が昨夜最初に混乱した方法です。コードからそのオーバーロードを削除すると、次のエラー メッセージが表示されます。
error: call of overloaded ‘myFunc(const char [15])’ is ambiguous
candidates are:
void myFunc(std::function<bool(char)>)
void myFunc(const string&)
これは、自己完結型のコンパイル可能な例です。
文字列リテラルに std::function ではなく std::string を選択させるにはどうすればよいですか? std::function のコンストラクターはテンプレート化されており、特に関数ポインターを取るように設計されているため、おそらくあいまいです。
私の文字列ライブラリは、具体的には、すでに typedef されているstd::function<bool(char)>
andのみを使用std::function<bool(const std::string&)>
しているため、明示的なコンストラクターを使用してそれらをクラスに継承できます。
利用可能な他の提案やオプションはありますか?