我正在讀斯科特·梅耶的有效的現代C++,打在他的建議的lambda
小號使用代替std::function
和std::bind
的項目。我理解他的論點和他對std::function
的缺點的主張,我同意他的觀點。存儲lambda表達式作爲成員混亂
截至今天,我決定切換到用於存儲lambda
的模板(不需要增變器)。我明白每種lambda
的類型只有編譯器才知道,甚至兩個相同的lambda
也會有不同的類型,所以下面的代碼如何編譯並工作得很好?
template<typename LambdaT>
class CaptureLambda
{
public:
CaptureLambda(const LambdaT& fn)
: mActionFn(fn) // initialize mActionFn to a user supplied lambda
{}
private:
LambdaT mActionFn{ []{} }; // initialize mActionFn to an empty lambda
};
我困惑的一點就是,怎麼來mActionFn
是默認啓動爲空拉姆達與不同類型的成員聲明內,但在類的構造函數中愉快地接受另一種類型的在它的參數lambda
?他們是cast
能夠彼此?如果是的話,爲什麼以下讓編譯器感到難過?
// Class stuff...
template<typename T>
void resetActionFn(const T& newFn) { // setter member
mActionFn = newFn;
}
// Class stuff...
這是否暗示用於nsdmi的表達式可能無效?我懷疑。就像你試圖擁有'std :: string s = 1;'一樣,它永遠不會被使用,因爲你在每個ctor中初始化's',所以你有 –
@PiotrS。在一個模板類中,比特會根據需要進行實例化。例如,給定'template struct S {void f(){T(); }};',你可以有'S '類型的對象,你只能調用它的'f'成員函數。正確地說,哪些位應該在尚未解決的問題中進行實例化,並且存在一些編譯器變體。 –
hvd
,因爲類模板的非虛擬成員函數在上下文需要時被實例化。我認爲這不適用於數據成員。爲此提供標準參考將會很好。 –