私は任意のタイプと数のパラメータで他の関数を渡してstd::function
にバインドすることが可能なテンプレート関数を作ろうとしています。私はこれを行うために管理:Variadicテンプレート、タイプ控除とstd ::関数
#include <iostream>
#include <functional>
int foo(int bar)
{
std::cout << bar << std::endl;
return bar;
}
template <typename Ret, typename... Args>
std::function<Ret (Args...)> func(std::function<Ret (Args...)> f)
{
return f;
}
int main()
{
//auto barp = func(foo); // compilation error
auto bar = func(std::function<void (int)>(foo));
bar (0); // prints 0
}
私はちょうどauto barp = func(foo);
を呼び出し、タイプが推測持っていると思いますが、この行は、次のコンパイルエラーを与える:
error: no matching function for call to ‘func(void (&)(int))’
auto barp = func(foo);
^
note: candidate is:
note: template<class Ret, class ... Args> std::function<_Res(_ArgTypes ...)> func(std::function<_Res(_ArgTypes ...)>)
std::function<Ret (Args...)> func(std::function<Ret (Args...)> f)
^
note: template argument deduction/substitution failed:
note: mismatched types ‘std::function<_Res(_ArgTypes ...)>’ and ‘int (*)(int)’
auto barp = func(foo);
^
は、なぜそれがでstd::function<_Res(_ArgTypes ...)>
に一致するようにしようとしていますint (*)(int)
?私は何とかコンパイラを_Res(_ArgTypes ...)
からint(int)
に展開する必要があると感じていますが、どうですか?
なぜあなたはまったく 'のstd :: function'に変換していますか? 'std :: function'は型消去クラスです:構造体の型情報を取り、大部分を消去します。型控除は引数をとり、その型を導き出し、コードを生成します。あなたは何かを消すためにどんなタイプを推測するように求めています。それは着用者に射撃する銃を作る鎧の服を作るようなものです。タイプイレージャーはほとんどの意味でタイプ控除の*反対*です。非常にまれなことです。それは可能ですが、C++には簡単な理由がありません*実用的なユースケースはありますか? – Yakk
オーバーロードや可変引数リストはどうですか?これはほんのわずかの状況で可能です。あなたはboost_typeを上げるようなものを使うことができます。 – tahsmith
@ Yakk、私は "memoization"関数をコーディングしようとしていました。つまり、同じパラメータで呼び出し可能なものを返し、以前の計算値を探すという点を除いて、元の関数を呼び出す引数の型を返します適切な地図に格納される)。元の関数を格納するには 'std :: function'を使います。これが可能かどうかはわかりません。 – Tarc