C++関数のパラメーターとしてラムダを使用したいのですが、関数宣言でどの型を指定するのかわかりません。私がやりたいのはこれです:
_void myFunction(WhatToPutHere lambda){
//some things
}
_
void myFunction(auto lambda)
とvoid myFunction(void lambda)
を試しましたが、これらのコードはコンパイルされていません。重要な場合、ラムダは何も返しません。
ラムダをC++関数のパラメーターとして使用するにはどうすればよいですか?
次の2つの方法があります。関数テンプレートを作成します。
template <typename F>
void myFunction(F&& lambda){
//some things
}
またはstd::function
でタイプを消去します
void myFunction(const std::function<void()/* type of your lamdba::operator()*/>& f){
//some things
}
基本的に2つの選択肢があります。
テンプレートにする:
template<typename T>
void myFunction(T&& lambda){
}
または、それを望まない(またはできない)場合は、type-erased std::function
:
void myFunction(std::function<void()> const& lambda){
}
逆に、auto
を使った試みは、gccで現在実装されている概念TSの下では正しかったので、 短縮テンプレート になります。
// hypothetical C++2x code
void myFunction(auto&& lambda){
}
またはコンセプト:
// hypothetical C++2x code
void myFunction(Callable&& lambda){
}
これがinline
関数の場合、次のようにテンプレートを優先します
template<typename Func>
void myFunction(Func const&lambda)
{
//some things
}
ラムダ、名前付きクラスのインスタンス、std::function<>
オブジェクト。
一方、この関数がinline
でない場合、つまり、あるコンパイル単位で実装されている場合、ジェネリックテンプレートを使用することはできませんが、std::function<>
オブジェクトと参照経由で渡されます。