2012-06-10 62 views
2

目前,我有一個CRTP基類,它利用特徵類來確定它的成員函數的返回類型。我一直在玩C++ 11,並且有下面的代碼,它消除了traits類的需要,但需要默認的函數模板參數。有沒有一些方法可以修改這個在Visual Studio 2012中工作,它不支持C++ 11的功能?在crtp基類中延遲成員函數實例化

#include <iostream> 

using namespace std; 

template<typename T, typename Ignore> 
struct ignore { typedef T type; }; 

template<typename T> 
struct A 
{ 
    template<class IgnoredParam = void> 
    auto foo() -> decltype(declval<typename ignore<T*, IgnoredParam>::type >()->foo_impl()) 
    { 
     return static_cast<T*>(this)->foo_impl(); 
    }   
}; 

struct B : public A<B> 
{ 
    int foo_impl() { return 0;} 

}; 

int main() 
{ 
    B b; 
    int i = b.foo(); 
    cout << i << '\n'; 
} 
+0

它支持可變模板參數嗎? –

+0

@litb:不,它不支持可變模板。這是它支持的功能[list](http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx)。 – Joe

回答

0

您可以簡單地使用

decltype(declval<T>()->foo_impl()) 

爲遞延收益類型。

+0

當我嘗試獲取有關未完成類型B的無效使用的錯誤時,我將聲明更改爲'auto foo() - > decltype(declval () - > foo_impl())''。這是你的意思嗎? – Joe

+0

@Joe:你正在使用哪個版本的VC11? AFAIK你看到的是一個錯誤,並且在開發者預覽版後修復。 – ildjarn

+0

@ildjam:我收到使用RC的錯誤。我也試過gcc 4.7並收到相同的錯誤。我認爲錯誤是正確的,因爲當B仍然是一個不完整的類型時,編譯器試圖實例化foo。這就是我試圖解決忽略和我的原始文章中的函數模板參數,它延遲了實例化,直到foo被實際調用,並且在那一點上,B是一個完整的類型。 – Joe