2017-11-13 12 views
2

テンプレート機能は、このようなその関数ポインタの引数を推測することができますテンプレート関数はラムダの引数を推定できますか?関数ポインタを取る

template<class... Args> 
void func(void (*ptr)(Args&& ...)) { 
    //Do something useful knowing the Args... 
} 

あなたは、引数としてラムダと同じことを行うことができます。 std::functionに頼ることなく、function_traitsのようなメタプログラミングの特性クラスを書くことなく?すなわち関数を使用するだけで引数を導き出す。

答えて

4

いいえ、それはできません。テンプレート引数の控除では、引数の型の「構成上」の一部である型、定数、テンプレートを推論することができます。たとえば、voidArgs...void(*)(Args&&...)から推測するか、TNT(&)[N]から控除します。タイプに現れないものは推論できません。

非多型ラムダ型Tの場合、&T::operator()の型にはラムダの引数型に関する推測可能な情報が含まれています。しかし、T自体はありません。

+0

これは、lambdasパラメータを取得する引数として 'decltype(&T :: operator())(Args && ...)'のようなものを書くことができますか、それとも厳密には不可能なのでしょうか? – Brian

+0

@Brianラムダが多型でない場合は、引数型として 'R(T :: *)(Args ...)'を入れ、 '&T :: operator()'を引数として渡すことができます。ラムダの 'operator()'はconst修飾されていてもいなくてもよく、 'noexcept'であるかもしれないし、そうでないかもしれないし、末尾にあるかもしれないし、持っていないかもしれないので、合計8つのオーバーロードが必要である省略記号。 – Brian

関連する問題