私は現在、関数オブジェクトをチェーンしているライブラリに取り組んでいます。
呼び出し可能なオブジェクト(現時点ではstd :: function)を受け取り、関数の出力タイプと入力タイプでパラメーター化された関数テンプレートを作成しています。これが私が定義しているものの単純化されたバージョンです:
template <typename In, typename Out>
std::vector<Out> process(std::vector<In> vals, std::function< Out(In) > func)
{
// apply func for each value in vals
return result;
}
私が抱えている問題は使用法です。ラムダを渡すと、コンパイラーが型を正しく推測できないようです。そのため、関数が存在しないと文句を言います。
std::vector<string> strings;
// does NOT compile
auto chars = process(strings,
[]( std::string s ) -> char
{
return s[0]; // return first char
}
);
ラムダを明示的にラップするstd::function
と、プログラムは次のようにコンパイルされます。
std::vector<string> strings;
// DOES compile
auto chars = process(strings,
std::function< char(std::string) >(
[]( std::string s ) -> char
{
return s[0]; // return first char
})
);
関数ポインターまたは関数オブジェクトの受け渡しはまだテストしていませんが、明示的なオブジェクトを直接渡さない場合、コンパイラーがパラメーターIn
とパラメーターを推測するのは難しいようです。Out
std::function
私の質問はこれです:これを回避する方法はありますか?それにより、呼び出しサイトで明示的に言及することなく、呼び出し可能なオブジェクトの入力/戻りタイプを推測できますか?
おそらく、入力/戻り型ではなく関数型でテンプレートをパラメーター化しますか?基本的に、任意の呼び出し可能オブジェクトのIn
とタイプを推測する必要があります。おそらく、テンプレート関数の戻り型のOut
ある種のauto
/トリックですか?decltype
ありがとうございました。