2015-04-16 48 views
1

我有一個類,我希望模板參數B具有默認類型。問題是默認類型是一個複雜的表達式,也取決於A的類型。使用模板參數的typedefed默認類型

下面的代碼說明了情況但顯然不能編譯,因爲defaultB類型不知道模板表達式內部。

template<class A, class B = defaultB> 
class Foo{ 

    typedef A::Bar Bar; 
    typedef Bar::Ex defaultB; 


}; 

有沒有人有一個想法如何正確解決這個問題?

+0

這不是簡單的 - >'模板'? – myaut

+0

@myaut 謝謝!那麼上面的例子是一個極端簡化的情況,問題是A :: Bar :: Ex實際上是一個非常複雜的表達式。 – user695652

回答

3

你可以保持默認的命名空間是這樣的:

namespace detail { 
    template <typename A> 
    using defaultB = typename A::Bar::Ex; 
} 

template<class A, class B = typename detail::defaultB<A>> 
class Foo{ 
}; 

這讓你有複雜的表達式,你在你的detail命名喜歡未做Foo聲明難看。

0

到TartanLlama的指教另一種方法是保持一個虛設類型層次到typedef的擡起到範圍:

template<class A> 
struct _Foo { 
    typedef typename A::Bar Bar; 
    typedef typename Bar::Ex defaultB; 
}; 

template<class A,class B=typename _Foo<A>::defaultB> 
struct Foo : _Foo<A> { 
};