从模板创建对象,类型由用户输入c ++输入

时间:2013-04-18 10:43:58

标签: c++ class templates object

我有一个类是模板。我希望程序询问用户他想要什么类型,然后根据他选择的类型实例化一个对象。最好的方法是什么?这样的东西,但它不起作用:

template <typename T> class Object {...};
cin >> type;
Object<type> newobject;

4 个答案:

答案 0 :(得分:4)

Polymorphism

它将根据用户输入创建基于对象模板和动态:

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;
}