1

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

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

4 回答 4

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;
}
于 2013-04-18T10:53:51.060 回答
1

至少有两种方法。

首先,使用基于用户输入的 if/switch 语句创建一个实例,然后将此实例存储在一个不知道特定类型是什么的指针中。它可以是指向抽象基类的指针,也可以是指向生成的包装器的类型已擦除指针(就像做什么std::function一样),或者是指向等价物的指针void和一个变量,用于说明以后要使用的类型。这在 C Java 和许多其他语言中是可行的。

第二种方法是打开用户输入,生成对象,然后继续运行知道模板生成的对象类型的代码。您可以使用 C 和其他 C 派生语言中的复制粘贴或宏或代码生成来做到这一点,但这种语言代码生成是该沿袭中的一种新技术。其他 C 派生语言中最相似的通用代码实际上是模糊类型擦除。

于 2013-04-18T11:39:20.677 回答
1

C++ 中的模板必须在编译时解析,所以你想要的在这里是不可能用模板来做的。您最好的选择可能是实现工厂方法模式

于 2013-04-18T10:50:36.030 回答
0

模板函数

您可以有条件地调用模板函数。这将在编译时生成所有必要的代码以支持所有需要的类型,但仅当您的 if 语句调用该代码时才会使用这些代码。然后,当您需要在函数中引用用户输入的类型时,您可以使用“T”。

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;
}
于 2018-02-22T05:41:57.310 回答