2016-11-30 92 views
0

我有基礎班級模板,在此基礎上製作了另一個班級,這些班級是我的基礎班級的專用版本。我知道如何從特定的專業化案例中排除一​​些方法,但是有沒有可能爲班級的成員做出這樣的決定?示例代碼,什麼我想要實現:按專業化排除班級成員

template<typename T> 
class Base { 
    This variable exists only when T==integer VARIABLE; 
} 

template <Typename T> 
WithVariable = using Base<int>; 

template <Typename T> 
Without = using Base<double> 

我認爲我應該使用std以某種方式::啓用,但使用它使得可以進行類型的變量「無效」的時候,我不想要這個變量。這仍然不是我想要達到的情況。

+0

您不需要'std :: enable_if'只需對'Base'的模板父類的特殊化。 PS。你不能創建'void'類型的變量... –

+0

請更具體一些。 – Yakk

+0

我想通過作爲模板參數之一的bool值。布爾值將表明,如果例如動物有樹幹,並且如果是的話,我想在類animal_with_trunk中有成員len_of_trunk。 animal_with_trunk必須是基類動物的專用版本。我不能使用繼承。 – Michocio

回答

2

你可以專門的班級沒有不需要的成員?

template <typename T> 
class Base { 
public: 
    T t; 
}; 

template <> 
class Base<int> { 
}; 

int main() { 
    Base<int> foo; 
    foo.t = 42; // Error: no member named 't' in 'Base<int>' 
} 
+0

但方法有問題。如果我想從多個成員中只排除一個成員,那麼我必須複製代碼。我對嗎? – Michocio

+0

你說得對,這似乎不適用於方法,而且很可能我不知道我在說什麼:http://melpon.org/wandbox/permlink/aaKLWW5eO3L8H93O –

2

做到這一點的一種可能方法是有條件地繼承。請看:

struct BaseWithVariable { 
    int n {42}; 
}; 

struct BaseNoVariable {}; 


template <typename T> 
struct Base : std::conditional<std::is_same<T, int>::value, BaseWithVariable, BaseNoVariable>::type {}; 

與用法:

Base<int> b {}; 
Base<double> d {}; 

std::cout << b.n << std::endl; 
std::cout << d.n << std::endl; // error 

你也可以寫你的類型明確的專業化,但如果你有一組類型(如整數或類型從特定鹼衍生)應該有不同於一般類型的成員,這個解決方案可能會有所幫助。

0

您可以使用使用SFINAE

#include <type_traits> 

template <typename, typename = void> 
struct base_of_base; 

template <typename T> 
struct base_of_base<T, typename std::enable_if<std::is_integral<T>::value>::type> 
{ int var; }; 

template <typename T> 
struct base_of_base<T, typename std::enable_if<!std::is_integral<T>::value>::type> 
{ }; 

template <typename T> 
class base : public base_of_base<T> 
{ }; 

int main() 
{ 
    base<int>  bi; 
    base<long> bl; 
    base<float> bf; 
    base<double> bd; 

    bi.var = 1; // OK 
    bl.var = 1; // OK 
    // bf.var = 1; // error: ‘class base<float>’ has no member named ‘var’ 
    // bd.var = 1; // error: ‘class base<double>’ has no member named ‘var’ 
} 
0

如何delete從類的特殊化荷蘭國際集團的功能基的基?

template <typename T> 
class Base { 
public: 
    void notUseful(); 
}; 

template<typename T> 
void Base<T>::notUseful(){ 
    std::cout << "not useful" << std::endl; 
    return; 
} 

template <> 
void Base<int>::notUseful() = delete;