我有一个类是模板。我希望程序询问用户他想要什么类型,然后根据他选择的类型实例化一个对象。最好的方法是什么?这样的东西,但它不起作用:
template <typename T> class Object {...};
cin >> type;
Object<type> newobject;
答案 0 :(得分:4)
它将根据用户输入创建基于对象模板和动态:
class Base
{
public:
virtual ~Base() {};
};
template <typename T>
class Type : public Base
{
T type;
};
int main()
{
int i;
cin >> i;
Base *b;
switch (i)
{
case 0: b = new Type<float>(); break;
case 1: b = new Type<int>(); break;
case 2: b = new Type<char>(); break;
}
// ...
delete b;
}
答案 1 :(得分:1)
C ++中的模板必须在编译时解析,因此您无需使用模板。您最好的选择可能是实施Factory method pattern。
答案 2 :(得分:1)
至少有两种方法。
首先,使用基于用户输入的if / switch语句创建实例,然后将此实例存储在不知道特定类型是什么的指针中。它可以是指向抽象基类的指针,也可以是指向生成的包装器的类型擦除指针(如std::function
所做的那样),或者指向等效于void
的指针和一个表示什么类型的变量它将在以后使用。在C Java和许多其他语言中,这种变化是可行的。
第二种方法是打开用户输入,生成对象,然后继续运行知道模板生成的对象类型的代码。您可以使用C和其他C派生语言中的复制粘贴或宏或代码生成来完成此操作,但这种语言代码生成是该谱系中的一种新技术。其他C派生语言中最相似的通用代码实际上是模糊类型擦除。
答案 3 :(得分:0)
您可以有条件地调用模板函数。这将在编译时生成所有必需的代码以支持所有需要的类型,但只有在if语句调用该代码时才会使用这些代码。然后,当您需要在功能中引用用户输入的类型时,您可以使用&#39; T&#39;。
template <typename T> class Object {...};
template <typename T> void myFunc() {
Object<T> newobject;
//statements
}
int main() {
cin >> type;
if (type == "int") myFunc<int>();
if (type == "double") myFunc<double>();
return 0;
}