【发布时间】:2016-11-30 19:09:15
【问题描述】:
假设我有一个 vector(或 list 或任何可能更适合此处的容器),我想将多个模板类型的对象(或指针)存储在:
std::vector<MyClass<double>> v;
// std::vector<MyClass<double> *> v;
不幸的是,我想在这个容器中存储不同的模板化对象(理想情况下,我需要在恒定的时间访问它们)。
我的第一个直觉是围绕MyClass 创建某种WrapperClass,它将在内部将任何MyClass 作为成员变量进行管理,但我不清楚如何将适当的类型传递给@987654327 @:
#include <iostream>
#include <string>
#include <stdlib.h>
#include <vector>
using namespace std;
template<typename T>
class MyClass
{
public:
MyClass() {}
~MyClass() {}
};
// templating this of course works, but it doesn't solve my problem
template<typename T>
class WrapperClass
{
public:
WrapperClass()
{
m_object = MyClass<T>();
}
~WrapperClass() { }
private:
MyClass<T> m_object;
};
int main()
{
WrapperClass<bool> tmp = WrapperClass<bool>();
std::vector<WrapperClass<bool> *> v;
return 0;
}
那么是否有 (A) 与 vector 不同的容器可以用于解决此问题,或者 (B) 有一种选择 @ 类型的方法987654330@ in WrapperClass 在构造函数内?我在想一些类似的事情:
class WrapperClass2
{
public:
WrapperClass2(unsigned int typeId)
{
switch (typeId)
{
case 0: m_object = new MyClass<bool>();
case 1: m_object = new MyClass<int>();
case 2: m_object = new MyClass<float>();
default: m_object = new MyClass<double>();
}
}
~WrapperClass2()
{
delete m_object;
}
private:
MyClass * m_object;
};
另一个想法可能是在向量中使用一些父 AbstractType,但我不确定这将如何帮助解决模板类型问题。
【问题讨论】:
-
让所有模板类继承自一个通用基类。在向量中存储一个指向公共基类的指针。
-
有很多可能的解决方案。什么是合理的取决于您的
MyClass模板。不过,这似乎是一个 X/Y 问题,询问某个原始问题 X 的想象中的不切实际的解决方案 Y。 -
注意:类型是模板实例这一事实是无关紧要的。
MyType<double>和MyType<int>是完全不同且不相关的类型,与MyOtherType和string是不同的类型没有什么不同。 -
X/Y 部分是您已经决定需要一个
vector并在其中存储不同的类型。如果您改为描述最终目标,而vector解决方案是实现该目标的方法之一,那么有人可能会提出一个完全避免vector的替代解决方案。 -
这里不是讨论编辑的地方。把它带到聊天室或元