假設我有以下示例性功能:如何避免在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
做什麼,並且lambda具有更復雜的返回類型。
如果我們嘗試編譯,編譯器會抱怨,因爲我們使用this
在頂層(不是在一個範圍內,將允許一個表達式):
error: lambda-expression in unevaluated context
error: invalid use of ‘this’ at top level
不過,我有使用捕獲的lambda,我通過call
爲了得到call
的返回類型的權利。你會如何解決這個問題,同時還要離開lambda?
注意:當然,我可以將lambda移動到某個幫助類型的operator()
,我使用this
指針的副本實例化,但我想避免該樣板。
我希望至少符合gcc 4.5。 – bitmask
你不能把lambda表達式放在例如'decltype'(這是第一個錯誤所指的),所以你也有另一個問題。 –
@LucDanton:謝謝。我沒有意識到這一點。你會認爲這個問題的延伸?我應該打開一個新的?任何機會繞過它,無論如何? – bitmask