基本的に、私ができるようにしたいのは、任意の数の任意のタイプのパラメーターを持つラムダを取得し、それを std::function に変換することです。次の方法を試しましたが、どちらの方法も機能しません。
std::function([](){});//Complains that std::function is missing template parameters
template <typename T> void foo(function<T> f){}
foo([](){});//Complains that it cannot find a matching candidate
ただし、次のコードは機能しますが、ジェネリック コードでは機能しないテンプレート パラメーターを明示的に指定する必要があるため、私が望むものではありません。
std::function<void()>([](){});
私は一晩中関数とテンプレートをいじっていましたが、これを理解できないので、どんな助けも大歓迎です。
コメントで述べたように、私がこれをやろうとしている理由は、可変個引数テンプレートを使用して C++ でカリー化を実装しようとしているからです。残念ながら、ラムダを使用すると、これはひどく失敗します。たとえば、関数ポインターを使用して標準関数を渡すことができます。
template <typename R, typename...A>
void foo(R (*f)(A...)) {}
void bar() {}
int main() {
foo(bar);
}
ただし、ラムダをそのような可変関数に渡す方法がわかりません。一般的なラムダを std::function に変換することに興味があるのは、次のことができるためですが、最終的には、テンプレート パラメーターを std::function に明示的に指定する必要があります。これは、回避しようとしていることです。
template <typename R, typename...A>
void foo(std::function<R(A...)>) {}
int main() {
foo(std::function<void()>([](){}));
}