必须所有与模板化类型交互的代码也使用模板
Must all code interacting with templated types also use templates?
必须所有与模板化类交互的代码也使用模板吗?
想象template<T>
class Data {
public:
Data(T value) {
this->value = value;
};
T getValue() {
return value;
};
virtual size_t size() = 0;
private:
T value;
};
对于几种可能的T
(String, int等),size()
将有特定的实现。
注意:我可以有一个抽象类,但是我不能有构造函数/getValue,也不能有虚方法,因为我必须指定它们的参数/返回值类型。
进一步想象我有一个函数,如
template<T>
size_t getSize(Data<T> value) {
return value.size();
}
虽然size()
对于不同的类型是不同的,但是发送方(getSize()
方法)不应该关心T
。
必须所有与模板化类交互的代码也使用模板吗?
是的。请注意,您拥有的是一个类模板,它是表达类族的一种方式。它不构成一个类。要做到这一点,你可以用Data<int>
这样的类型实例化模板,这将排除Data
的一个版本,其中T
是int型。
为什么需要模板化函数
原因是Data<int>
和Data<double
不是同一个类。就像int
和double
不同一样,当使用不同的模板参数初始化类模板时,您将获得不同的类。正因为如此,如果你想要一个函数可以处理类模板可以产生的任何东西,那么这个函数也需要是函数模板,这样它就可以为每个不同的Data
产生一个函数。
和我能避免它吗
您可以做的一件事是让Data
从基类派生,然后将size
移动到基类中。然后,您可以编写函数以接受对基类的引用,而不是类模板。
这是你想要的吗?
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);
}
相关文章:
- Qt VTK交互风格的信号到小部件
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- Qt Quick-如何仅从c++代码与qml属性交互
- 我如何在此代码中使用键盘交互
- 生成代码以与不需要重新编译的正在运行的 cpp 应用程序交互的好方法是什么?
- 与C++代码中的 qml 对象交互
- 打印代码 128 C 条形码通过与 OPOS 公共控件 1.8 交互C++代码
- c++代码能可靠地与其他c++代码交互吗?
- 必须所有与模板化类型交互的代码也使用模板
- Boost日志:日志设置文件和代码配置的交互
- 目标代码重定位和英特尔引脚交互
- 从c++代码与servlet交互
- 与Python一起运行C++代码并与之交互