は、私は以下の例示的な機能を持っていると仮定しますdecltype式で変数を指定する方法を教えてください。
template <typename Fn> auto call(Fn fn) -> decltype(fn()) {
return fn();
}
この機能について重要なことは、その戻り値の型を推論することができ、そのテンプレートパラメータ、に依存していることです。最終的には、戻り値の型は関数の呼び出し方法に依存します。
struct X {
int u;
auto test() -> decltype(call([this]() -> double {this->u = 5; return 7.4;})) {
return call([this]() -> double {this->u = 5; return 7.4;});
}
};
あなたが見ることができるように、X::test
同じ戻り値を返す、call
を呼び出します。
は今、我々はまた、テストクラスを持っています。この場合、返り値の型は普通はdouble
として与えられますが、ちょっとわかりませんが、call
が何であるか、そしてラムダがより複雑な戻り値の型を持っていると仮定しましょう。
我々はこれをコンパイルしようとした場合、我々は(ない表現を可能にする範囲で)トップレベルでthis
を使用しているので、コンパイラは、文句を言うだろう:
error: lambda-expression in unevaluated context
error: invalid use of ‘this’ at top level
しかし、私が持っているcall
の返品タイプを取得するためにcall
に渡すラムダのキャプチャを使用する。ラムダを残しながら、これを回避するにはどうしたらいいですか?
注:ラムダをのヘルパータイプにすることもできますが、これはthis
ポインタのコピーでインスタンス化しますが、定型文を避けたいと思います。
少なくともgcc 4.5に準拠したいです。 – bitmask
ラムダ式を例えば'decltype'(これは最初のエラーが何を意味しているか)であるので、別の問題もあります。 –
@LucDanton:ありがとう。私はそれを認識しませんでした。あなたはこの質問の延長を考えますか?私は新しいものを開くべきですか?それを回避する機会はありますか? – bitmask