関数のような型のテンプレートパラメータを用意し、その型の引数を取るだけです。
template <typename Function>
void foo(Function func) {
// Use func like so
func(10);
}
これは、標準ライブラリアルゴリズムがそれを行う方法です。あなたは次のようにラムダでそれを呼び出すことができます:
foo([](int x) { std::cout << (x * 2) << std::endl; });
もちろん、これには、ドキュメントでタイプとして期待する関数の種類を指定する必要があります(取得するまで( ConceptsFunction
を取得するまで)。単項である必要がありますか?バイナリである必要がありますか?どのタイプの引数を取る必要がありますか?何を返す必要がありますか?
または、次を使用して特定のタイプの関数を取得することもできますstd::function
。
int foo(std::function<int(char)> func) {
return func('a');
}
今回は、引数foo
を取り、を返す関数のようなオブジェクトのみを取ります。ただし、このメソッドには1つの欠点があります。それは、コンパイラーが、渡したラムダをインライン化する可能性が低いことです。char
int
func
関数を引数として取る最も基本的な方法は、関数ポインターを使用することです。
int foo(int (*func)(char)) {
return func('a');
}
ただし、これは関数ポインターのみを取ります(一部のラムダは関数ポインターに変換できます)。ファンクターやその他の種類のものは必要ありません。