2012-05-15 52 views
2

要有一種鴨子類型的,我做鴨打字C++(通過其非類型模板參數的值專門的模板功能)

template<bool b> 
struct A{ 
    static template<typename V> f1(V*, [other params]);  
    static template<typename V> f2(V*, [other params]);    
}; 

template<> template<typename T> 
void A<false>::f1(V*, [other params]){} 

template<> template<typename T> 
void A<true>::f1(V*, [other params]){ 
    ...some code... 
} 

template<int flags> 
struct V{ 
    void f(){ 
    A<flags&Some compile time conditions>::f1 (this,[params]); 
    A<flags&Some compile time conditions>::f2 (this,[params]); 
    } 
}; 

你覺得還有一個更優雅的解決方案,這是不是Template class, function specialization (我不想額外PARAM添加到功能)

我想這樣做

template<int X> struct C{ 
void f(){std::cout<<"C::f"<<std::endl;}; 
}; 


template<> struct C<0>{ 
}; 


template<int X> struct D{ 
C<X> c; 

template<bool b> 
void f(); 

void g(){ 
    f<X!=0>(); 
} 

}; 

template<> 
template<int X> 
void D<X>::f<true>{ 
c.f(); 
}; 

template<int X> 
template<> 
void D<X>::f<false>{}; 


int main(){ 
D<3> ch; 
ch.g(); 

D<0> cn; 
cn.g(); 

} 

但這並不是有效的代碼,並我得到錯誤:用作聲明的template-id'f'。

有沒有辦法通過其非類型模板參數的值專門化模板函數?

+0

這可能有助於在main()中給出如何使用D的示例。 –

+0

對不起,主要是我打算使用D.C僅用於做出「可能存在或不存在在那裏「 –

回答

1
template<> 
template<int X> 
void D<X>::f<true>(){ 
c.f(); 
}; 

template<int X> 
template<> 
void D<X>::f<false>(){}; 

這是非法的(所有嘗試都是)。當你專門化一個成員函數模板時,它的封閉類也必須專門化。

但是,您可以通過將您的函數包裝在模板化的結構中來輕鬆克服該問題,該結構將採用其模板參數。類似於

template <int X, bool B> 
struct DXF; 

template <int X> 
struct DXF<X, true> 
{ 
    static void f() { // B is true! 
    } 
}; 

template <int X> 
struct DXF<X, false> 
{ 
    static void f() { // B is false! 
    } 
}; 

並且用DXF<X, (X!=0)>::f()來稱呼它。

但是,看起來你只是想專注於X==0。在這種情況下,你可以專注:

template <> 
void D<0>::f() {} 

注意f在這種情況下是不是一個成員模板。


你可以去的另一個選擇是重載。你可以換你int在一些模板的參數列表,像這樣:

template<int X> struct D{ 
C<X> c; 

void f(std::true_type*) { ... true code ... } 
void f(std::false_type_*) { ... false code ... } 
void g(){ 
    f((std::integral_constant<bool, X!=0>*)0); 
} 

注意true_type和false_type只是typedef S的std::integral_constant<bool, true>false,RESP。

+0

親愛的jpalecek,謝謝。問題出現在我想要使用該類的成員時。在我的解決方案中,我總是傳遞一個V *,我基本上將它用作「this」。 這是我想要的模板的主要原因 void f();裏面D(這將採取V的角色) –

+0

@FabioDallaLibera:是的。我認爲你的解決方案是可以的。我在答案中增加了另一種可能性。 – jpalecek

+0

謝謝你,你的第二個解決方案非常接近http://stackoverflow.com/questions/2349995/template-class-function-specialization 我想這是唯一可行的方法來做到這一點,我會堅持你的解決方案,坦克你 –