2017-10-24 8 views
1

eventsはテンプレートポリシーから構築されたstlコンテナで、基本型はインバウンドとアウトバウンドの型から構成されます。ラムダのメンバー関数上のテンプレートは、自動で推測されます。

​​

イベントを処理した後、ランタイムパラメータに基づいて計算を行う必要があります。例は次のとおりです:

いくつかの方法があります。同じ基本タイプを返すかもしれないし、返さないメソッドもあります。

cool::transform(events.deltas(), [](const auto &current) { return current.other(); }); 

ので、私は宣言することができ、これをテンプレートに方法はあります:

cooler::transform<method>(events.deltas()) 

ボーナス質問:私たちは、この方法は、実際に基になる型に存在する場合にのみコードを有効にするには、テンプレートを使用することはできますか?

答えて

1

ので、私は宣言することができ、これをテンプレートに方法があります:

はそうでもない - テンプレートパラメータとして「方法」を渡すことのない落とし穴のない方法はありません。オーバーロードされた/テンプレートメンバー関数に問題があります。あなたが現在持っているラムダ・ソリューションは最高の一つです - 私は、定型を減少させるためにccurrentを短縮し、auto&&を使用することをお勧め:

cool::transform(events.deltas(), [](auto&& c){ return c.method(); }); 

我々は場合にのみ、コードを有効にするには、テンプレートを使用することができますメソッドは実際に基になる型に存在しますか?

はい、detection idiomを使用して、式が有効かどうかを確認できます。私はそれをカバーする記事や他のよりパワフルで簡潔なテクニックを書きました:"checking expression validity in-place with C++17"

+0

ありがとう、私はそれを見るまでオート&忘れています。最初の質問では、ラムダを呼び出し可能なものとして宣言し、その情報を使用する際の問題は何ですか? method()を基底型のクラス定義の外に移動し、代わりにインラインメソッドとして宣言した場合はどうなりますか? – William

関連する問題