2014-03-28 62 views
1

缺少的默認模板參數,我有這樣一個類:解決方法在Visual C++ 2012

template <class Object = NullObject> 
class MyClass : OptimizedStorage<Object> { 
... 

public: 
    //Cannot do this in Visual studio 2012 
    template <class Object2 = Object, 
       class = enable_if<!is_same<Object2, NullObject>::value>> 
    Object & get() const { 
     return this->object_; 
    } 
} 

有誰知道:

  1. 具有該界面中的解決方法。
  2. 一些其他的解決方法,即使它使事情變得更加骯髒,仍然允許我在潛在對象存在的情況下使用get()

問候

+0

您可以使用'的std :: enable_if'上返回類型。 – Jarod42

+0

順便說一句,第二個模板參數應該是'class = typename enable_if <!is_same :: value> :: type' – Jarod42

回答

1

一個簡單的解決方法是編寫一個包裝函數只是調用模板。例如:

private: 
    template<typename ENABLER> 
    Object& get_() 
    { 
     return this->object_; 
    } 

    template<typename Object2> 
    Object& get_() 
    { 
     return get_<typename std::enable_if<!std::is_same<Object2,NullObject>::value>::type>(); 
    } 

public: 
    //Overload for default Object template parameter: 
    Object& get() 
    { 
     return get_<Object>(); 
    } 

當然,編譯器可以內聯所有的包裝,因此性能在這裏不是問題。

請注意,我已經摻雜了const限定符:您正在返回對內部數據的引用,即getter不能/不應該是const

+0

這是行不通的,因爲我需要啓用或禁用給定模板參數的函數。前端函數只能在某些情況下存在,我不知道如何解決這個問題。 –

+0

似乎在我的情況下不編譯。它對兩個版本的'get_'函數感到困惑。 –

+0

只需稍作更改即可。我將最內部的功能命名爲get2_ –

0

以下可能會有所幫助:

template <class Object = NullObject> 
class MyClass { 
    Object object_; 

    template <class T> 
    typename std::enable_if<!std::is_same<T, NullObject>::value, Object &>::type 
    get_() { return this->object_; } 
public: 
    Object& get() { return get_<Object>(); } 
}; 

,或者你可以專注你的結構(即可能需要一些複製/粘貼:/):

template <class Object = NullObject> 
class MyClass { 
    Object object_; 
public: 
    Object& get() { return this->object_; } 
}; 

template <> 
class MyClass<NullObject> { 
public: 
    // No get function. 
}; 
+1

我知道這個解決方案(部分專業化)。但我討厭重複代碼。當你修改它時,如果你忘記了任何東西都很脆弱。 –

相關問題