私はこれを持っている場合とし、その後、私が使用して初期化することができますfs
関数(または関数オブジェクト)のセットを決定する方法 std :: function <R(T1,T2)>と互換性のある関数型のセットを決定するためのルールはありますか?
std::function<int(int,int)> fs;
? folllowingの許可とされていません
:もちろん
std::function<int(int,int)> fs = [](int, int) { return int(10); };
std::function<int(int,int)> fs = [](char, char) { return char(10); };
std::function<int(int,int)> fs = [](int, short) { return int(10); };
std::function<int(int,int)> fs = [](double, int) { return float(10); };
std::function<int(int,int)> fs = [](int, wchar_t) { return wchar_t(10); };
std::function<int(int,int)> fs = [](const char*, int){ return "string"; };
std::function<int(int,int)> fs = [](const char*, int){ return 10; };
std::function<int(int,int)> fs = [](const char*, int){ return std::string(); };
、私はコンパイルして罰金コンパイルどれ見ることができる、としません。しかし、それはパラメータのタイプと戻り値の型の違いを理解するのに役立ちません。どのように私はそれらのために異なるタイプを使用するために行くことができますか?
つまり、関数(または関数オブジェクト)を与えても、std::function<int(int,int)>
と互換性があるかどうかをコンパイル時にどのように判断できますか?私はほとんど理解していないが、私は十分自信がない。
std::function<R(T1,T2)>
と互換性のある関数タイプのセットを決定するためのルールを理解し、レイアウトするのを手伝ってください。メタプログラミングは、互換性のない機能を使用する場合、ユーザーに通知し、素晴らしいエラーメッセージを生成するのに役立ちますか?ところで、第一のグループは互換性があるように思われる
この回答は標準ライブラリによって公開されている機能の文脈のようです...私の答えが間違っている場合は、その理由についてコメントできますか?編集 - この特性は戻り値の変換を無視しているようです... – Potatoswatter
@Potatoswatter:これらの特性の実装を見直しました。それらは 'std :: forward'、' std :: is_convertible'、 'std :: is_same'に依存しています。それらはstd :: libの一部として実装できます。私は私の答えを見直して、あなたの答えが間違っていることを暗示している場所を見ていない。私の答えは、あなたが参照するセクションのメタプログラミング実装を提供するだけです。 OPは、メタプログラミングのソリューションについて尋ねたので、私は答えが適切であると思った。戻り値の変換について:これは '__invoke_of'と' is_convertible'を使って '__callable'でカバーしています。 –
よろしいですか。唯一の意見の不一致は、私の回答が「あらかじめパッケージ化された標準的な回答」であると考えていることです。戻り値の型変換に関して、私はリンクをたどらず、希望の戻り値型にアクセスすることができない非メンバのテンプレートであると仮定しました。ユーザーレベルでは、 'std :: is_convertible :: type、R> :: value'では十分ではありませんか?私はあなたがSFINAEか「偽」の結果を望むかどうかにかかっていると思います。 –
Potatoswatter