2016-11-30 61 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;