2016-04-08 9 views
4

hereからstd::functionにはfunction_typeがないか、またはそれを初期化するのに使用された実際のタイプをエクスポートする同等のメンバータイプがあります。
result_type,argument_type、およびfirst_argument_typeおよびsecond_argument_typeがありますが、前述のタイプのものはありません。
なぜインタフェースの一部としてそのようなタイプを提供しないのですか?
確かにそれには正当な理由がありますが、私はその理由を理解することができないので、私はそれを見つけ出すのが好奇妙です。私は最初の質問がになります知っているためなぜstd :: functionにfunction_typeまたは同等のメンバータイプがないのですか?


は、なぜあなたはそれが、まあ、私は彼らの基礎となるタイプは、それはだsfinae評価、が同じであるかどうかを確認するためstd::is_same<F1::function_type, F2::function_type>::valueのような何かをしたいことを想像必要がありますか記号が同じである限り、異なる機能を含んでいれば問題ありません。
私はそれがあまり意味がないことを認めます、正直なところ質問は好奇心のためです。

はそれを

を初期化するために使用される実際の型をエクスポートする:

his answerのコメントで@Brianで述べたように

、私は私が書いたときを初期化用語を誤用EDIT

私が興味を持っているのは、本当にテンプレート引数です。
例として、std::function<void(S&, int)>Sは構造体です)の場合、function_typevoid(S&, int)になります。

+1

'is_same'チェックでは、' F1'と 'F2'が同じタイプであるかどうかを簡単にチェックできますか? – Brian

+0

@ブライアンええ、絶対に、私のコメントに注意してください*私はそれがあまり意味がないことを認め*! :-) ...私はちょうど私がそれのために合理的な使用を見つけることができない場合でも、それが機能のインターフェイスの一部ではない理由があるかどうかを知りたいだけで、これはすでに良いだろう確かに応答。 *それが役に立たないのかどうかわからない*唯一の合理的な回答か他の理由がある場合。それで全部です。 – skypjack

答えて

6

あなたは間違った質問をしていると思います。正しい質問は、なぜそのようなメンバータイプがあるべきかということです。

の場合、たとえば、あなたがstd::functionのいずれかの特殊化を受け入れることができます関数テンプレートを作成し、その後、テンプレートパラメータは、すでにあなたにすぐに利用できるようになります:

template <typename T> 
void f(std::function<T> F) { 
    // you wouldn't write decltype(F)::function_type here; you'd just write T 
} 

より不便な場合は、中にあなたのものですここで

template <typename Callable> 
void f(Callable C); 

のようないくつかの機能を持っている、あなたはCallablestd::function専門であるという保証はありませんので、たとえstd::function<T>はよ、typedef T function_typeを持っていました任意の呼び出し可能ファイルにはCallable::function_typeにアクセスしたくありません。だから、ここでの使用はありません。

正しい質問は、のコンテナ(typedef T value_type)のような、いくつかの標準ライブラリクラスがテンプレートパラメータを公開するのはなぜですか?答えは、コンテナタイプが満たすべき要件の特定のセットが標準にあることです。これは、さまざまなタイプのコンテナで動作するジェネリックアルゴリズムを書くことが可能でなければならないという設計目標を反映しています。形式はC<T>です。それは、すべてのコンテナがvalue_typeを公開することを強制するのが理にかなっています。これは、それが任意のコンテナから要素タイプを抽出する唯一の統一方法だからです。 std::functionはまた、いくつかCallable概念のインスタンスであれば任意のCallableを受け入れ、コードが機能タイプにアクセスできるよう

することは、それがfunction_typeのtypedefがあるという要件を持つように理にかなって。しかし、それはそうではなく、単一のテンプレートstd::functionにしか持たないことは有益ではありません。

3

あなたは簡単に1を書き込むことができます。

template < typename T > 
struct function_type; 

template < typename Sig > 
struct function_type<std::function<Sig>> { using type = Sig; }; 

あなたの用語の場合:インスタンス化は、あなたが探している言葉です。テンプレートがであるタイプを探していますが、がインスタンス化されています。

メンバータイプではないことを知っている唯一の人は、その機能をデザインした人と、それを投票した人(多分)です。それは単に誰も考えなかったものかもしれません。それは少しはっきりしているように見えますが、それはそれを望むという視点からの見通しです。

関連する問題