我们说我的课程如下:
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);
答案 0 :(得分:3)
没有
C ++中标识符的类型必须是静态知道的。没有机制在使用类层次结构之外指定“一组类型之一”。
答案 1 :(得分:0)
您可以使用继承和Factory Method模式:
Object* pObj = CreateObject(type); // IntObject or CharObject
答案 2 :(得分:0)
模板实例(例如Object<char>
和Object<int>
)是不同类型。除了模板之外,你所做的基本上与尝试创建一个可以是char
或int
的变量基本相同,具体取决于用户在运行时的选择。你做不到;编译器需要在编译时知道所有变量的类型。
您可以使用tagged union或类似Boost.Variant之类的内容来获得类似的效果。或者,您可以使用虚函数创建一个抽象基类,该函数表示您要对这些值执行的操作,并编写为不同类型的值实现这些虚函数的派生类。但是你在这里用模板尝试的方法是不可能的。
答案 3 :(得分:0)
获取大部分代码,并在static
类中使用template
方法,其类型T
为char
或int
现在执行一个if / else并使用正确的类型调用静态方法。