【问题标题】:How can I assign value to a template only once?如何只为模板赋值一次?
【发布时间】:2014-03-23 15:24:21
【问题描述】:

假设我有一个类如下:

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

现在在 main 中,我想创建这些对象,假设我提示用户输入指定 T 的输入。假设 T 可以是 int 或 char,那么输出可能类似于:

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

【问题讨论】:

  • 模板参数在编译时进行评估。真的没有办法通过用户输入来获取它们。

标签: c++ templates object


【解决方案1】:

没有。

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

【讨论】:

    【解决方案2】:

    模板实例,例如您的Object&lt;char&gt;Object&lt;int&gt;,是不同的类型。除了模板,您所做的基本上与尝试创建一个变量相同,该变量可以是charint,具体取决于用户在运行时的选择。你不能那样做;编译器需要在编译时知道所有变量的类型。

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

    【讨论】:

      【解决方案3】:

      将您的大部分代码设为template 类中的static 方法(或多个方法),其类型Tcharint

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-13
          • 2011-05-23
          • 1970-01-01
          • 2020-02-10
          • 1970-01-01
          • 2015-05-13
          相关资源
          最近更新 更多