如何仅为模板分配一次值?

时间:2014-03-23 15:24:21

标签: c++ templates object

我们说我的课程如下:

template <class T>
class Object {
    private:
        T object;
    public:
        Object(T object) : object(object) {}
};

现在在main中,我想创建这些对象,让我们说我提示用户输入指定T.假设T可以是int或char,所以输出可能是这样的: / p>

Do you want to create a char or int (c/i)? 

一旦用户指定,我希望能够创建该对象。但是,我不想要通过if...else构造。也就是说,这似乎需要做的方式是

if (answer == 'c') {
    Object(character);
} else {
    Object(int);
}

显然不完全正确,但这就是这个想法。然而,这真的很烦人,因为还有其他更复杂的事情发生,我基本上每次都要重构这个if...else树,使代码相当杂乱。

有没有办法做类似的事情:

type = character || int; //this would still be determined by an if..else
Object(type);

4 个答案:

答案 0 :(得分:3)

没有

C ++中标识符的类型必须是静态知道的。没有机制在使用类层次结构之外指定“一组类型之一”。

答案 1 :(得分:0)

您可以使用继承和Factory Method模式:

Object* pObj = CreateObject(type);  // IntObject or CharObject

答案 2 :(得分:0)

模板实例(例如Object<char>Object<int>)是不同类型。除了模板之外,你所做的基本上与尝试创建一个可以是charint的变量基本相同,具体取决于用户在运行时的选择。你做不到;编译器需要在编译时知道所有变量的类型。

您可以使用tagged union或类似Boost.Variant之类的内容来获得类似的效果。或者,您可以使用虚函数创建一个抽象基类,该函数表示您要对这些值执行的操作,并编写为不同类型的值实现这些虚函数的派生类。但是你在这里用模板尝试的方法是不可能的。

答案 3 :(得分:0)

获取大部分代码,并在static类中使用template方法,其类型Tcharint

现在执行一个if / else并使用正确的类型调用静态方法。