web-dev-qa-db-ja.com

ラムダをC ++関数のパラメーターとして使用する

C++関数のパラメーターとしてラムダを使用したいのですが、関数宣言でどの型を指定するのかわかりません。私がやりたいのはこれです:

_void myFunction(WhatToPutHere lambda){
    //some things
}
_

void myFunction(auto lambda)void myFunction(void lambda)を試しましたが、これらのコードはコンパイルされていません。重要な場合、ラムダは何も返しません。

ラムダをC++関数のパラメーターとして使用するにはどうすればよいですか?

18
Donald Duck

次の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
}
20
Jarod42

基本的に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){
}
14
krzaq

これがinline関数の場合、次のようにテンプレートを優先します

template<typename Func>
void myFunction(Func const&lambda)
{
    //some things
}

ラムダ、名前付きクラスのインスタンス、std::function<>オブジェクト。

一方、この関数がinlineでない場合、つまり、あるコンパイル単位で実装されている場合、ジェネリックテンプレートを使用することはできませんが、std::function<>オブジェクトと参照経由で渡されます。

2
Walter