2013-06-12 65 views
2

我有一個問題,爲const提供正確的重載,而不是使用新的返回值語法提供const getter函數。重載const而不是const函數的返回值語法

在我的課PhysicalNode我用新的返回值語法定義了一個getter函數。這是需要的,因爲getter的返回類型取決於成員的類型。

class PhysicalNode { 
private:  
    solver::EnergySolver energySolver_; ///< The energy solver of this node 
    //solver::EnergyMomentumSolver energySolver_ 
public: 
    auto getEnergySolver()-> typename 
     std::add_lvalue_reference<decltype(PhysicalNode::energySolver_)>::type; 
} 

但是我現在想要提供這個方法爲const。

通常我會使用函數重載來定義我的const,而不是像那樣的const getter函數。

class PhysicalNode { 
private:  
    solver::EnergySolver energySolver_; 
public: 
    const solver::EnergySolver& getEnergySolver() const; 
    solver::EnergySolver& getEnergySolver(); 
} 

我曾嘗試下面的函數聲明,但它不工作:

const auto getEnergySolver() const-> typename 
     std::add_lvalue_reference<decltype(PhysicalNode::energySolver_)>::type; 

的編譯錯誤是:

PhysicalNode.cpp:72: error: invalid initialization of reference of type 
'std::__add_lvalue_reference_helper<LbmLib::solver::EnergySolver, true, 
false>::type {aka LbmLib::solver::EnergySolver&}' from expression of type 
'const LbmLib::solver::EnergySolver' 

如何做我需要定義函數聲明定義這個函數不變。

+0

你爲什麼使用'typename'? 'PhysicalNode'是一個類模板嗎? –

+0

因爲我沒有得到decltype的工作。但因爲你的答案,我現在知道如何避免:) – tune2fs

+0

好吧,很高興它幫助:) –

回答

4

如果你真的想用這個符號和標準型的特質,你應該寫你的const超載是這樣的:

auto getEnergySolver() const -> 
    std::add_lvalue_reference< 
     std::add_const<decltype(PhysicalNode::energySolver_)>::type 
//  ^^^^^^^^^^^^^^ 
     >::type; 

否則你會返回一個參考非const,這顯然是考慮到您的會員功能錯誤const - 合格。

但是請注意,是不是真的在這裏需要的那種類型的特徵(如EnergySolver只是一個普通的類型,而不是引用類型別名):

auto getEnergySolver()-> decltype(PhysicalNode::energySolver_)&; 
auto getEnergySolver() const -> decltype(PhysicalNode::energySolver_) const&; 

但即使decltype是不必要的。如果你真正的程序是不是比你展示的例子更爲複雜,這就夠了:

auto getEnergySolver()-> solver::EnergySolver&; 
auto getEnergySolver() const -> solver::EnergySolver const&; 
+0

以這種方式宣佈獲得者的好處是什麼?似乎過於複雜 – paulm

+0

@ paulm:在這個具體的情況下沒有任何好處,我猜測OP只是想嘗試這個新的語法 –

0

decltype(PhysicalNode::energySolver_)是平原EnergySolver,不const EnergySolver儘管該方法const,因爲表達不使用this,這是什麼,const預選賽真正影響。由於PhysicalNode尚未完成,因此在此情況下您不允許使用decltype(this->energySolver_)

你必須做一些像-> const decltype(PhysicalNode::energySolver_)&;-> std::add_lvalue_reference<std::add_const<decltype(PhysicalNode::energySolver_)>::type>::type;或之間的東西。

0

目前還不清楚爲什麼「傳統」的方法是不適合你的目的。

decltype的加工和添加/刪除技巧是掩蓋模板,希望過度通用的理由。你必須處理未知類型和你無法控制的類型。

對於通常的情況,只需添加幾個typedef並直接使用它們就會更清晰。

爲了您的嘗試,IMO你使用不當,可嘗試在前面,或自動在前面常量汽車&和裝配式後一路 - >,combininge remove_reference,然後add_const然後add_lvalue_reference,它可能工作,儘管會讓頭部旋轉。

相關問題