2016-10-27 29 views
2

所有与模板类交互的代码都必须使用模板吗?所有与模板类型交互的代码都必须使用模板吗?

想象

template<T> 
class Data { 
public: 
    Data(T value) { 
     this->value = value; 
    }; 
    T getValue() { 
     return value; 
    }; 
    virtual size_t size() = 0; 
private: 
    T value; 
}; 

会有的size()特定实现几种可能T(字符串,整数,等等)。

注意:我可以有一个抽象类,但我不能既没有构造函数/ getValue,也没有虚拟方法,因为我将不得不指定它们的参数/返回值类型。

进一步假设自己需要的功能,如

template<T> 
size_t getSize(Data<T> value) { 
    return value.size(); 
} 

size()虽然将是每种不同类型的不同,发件人(getSize()方法)不应该关心T

所以问题是为什么有必要模板函数,我可以避免它?

+1

如果您只想与单个Data的专业化进行交互,但通常不需要任何Data,则可以避免这种情况。与“Data ”互动不需要模板,但通常会与“Data ”进行交互,因为Data的每个专门化实际上都是不同的类型。尝试添加'static_assert(std :: is_same ,数据> :: value,“类型不同。”);'代码,你会看到它。 –

+0

也许你正在寻找[类型擦除技术](http://stackoverflow.com/documentation/c%2b%2b/2872/type-erasure) –

回答

3

必须全部代码模板类交互也使用模板?

是的。请注意,你所拥有的是一个class template这是一种表达类的家庭的方式。它不会成为一个班级。您通过使用像Data<int>这样的类型创建模板来实现此目的将标出Data的版本,其中T是一个int。

为什么是必要的模板功能

的原因是Data<int>Data<double是不一样的类。就像intdouble不同,当使用不同的模板参数来安装类模板时,会得到不同的类。如果你想要一个能够处理类模板可以产生的任何东西的函数,那么这个函数也需要f unction template,所以它可以为每个不同的Data生成一个函数。

,我能避免它

有一两件事你可以做的是从一个基类有Data dervive,然后移动到size基类。然后你可以编写函数来接受对基类的引用,而不是类模板。

+0

所以基本上像一个接口,对不对?我忘了C++有多重继承,因此不需要支持接口。 :)谢谢 –

+0

@peter耶,就像一个界面。乐意效劳 – NathanOliver

2

这是你在找什么?

class Base 
{ 
public: 
    virtual size_t size() = 0; 
}; 

template<typename T> 
class Data : public Base 
{ 
public: 
    Data(T value) { 
     this->value = value; 
    }; 
    T getValue() { 
     return value; 
    }; 
    size_t size() 
    { 
     return this->value.size(); 
    } 
private: 
    T value; 
}; 

size_t getSize(Base& value) 
{ 
    return value.size(); 
} 

void test() 
{ 
    std::vector<int> vi; 
    Data<std::vector<int>> d(vi); 
    getSize(d); 
} 
相关问题