【问题标题】:How to make a generic template C++ pointer?如何制作通用模板 C++ 指针?
【发布时间】:2022-08-16 23:34:44
【问题描述】:

假设下面的sn-p。我怎样才能使这个编译/工作?我不想将print 移动到String/Float 类,因为在我的实际情况下,这个函数结合了很多数据。

所以基本上我想要一个指向“任何类型(在这种情况下为字符串/浮点数)”的指针/成员,然后使用它,并动态调用其他东西(在这种情况下print)?

我认为这不起作用(除其他外),因为它无法在编译时确定 Tptr 将在编译时具有哪种类型。

解决此类问题的一般模式是什么?

#include <iostream>

template<typename T>
class AbstractClass {
   virtual T getValue()=0;
};

class StringClass : public AbstractClass<std::string> {
   std::string getValue() override {
      return \"A\";
   }
};

class FloatClass : public AbstractClass<float> {
   float getValue() override {
     return 1;
   }
};

class Processor {
   public:
   AbstractClass<T>* ptr;

   void doIt() {
     ptr=new StringClass();
     print(ptr->getValue());
     delete ptr;
     ptr=new FloatClass();
     print(ptr->getValue());
     delete ptr;
   }

   void print(std::string i) {
     std::cout << \"String \"<<i<<std::endl;
   }
   void print(float i) {
    std::cout << \"Float \"<<i<<std::endl;
   }
}

int main() {
   Processor a;
   a.doIt();
}
  • 抱歉,但 C++ 在基本层面上根本无法以这种方式工作。
  • 你不能写AbstractClass&lt;T&gt; 而不指定T 是什么。但是,您可以使用std::anystd::variant&lt;&gt;std::visit
  • 将打印纯虚成员函数添加到抽象类并在每个派生类中实现它。

标签: c++ templates generics


【解决方案1】:

如果你想要一个对象是给定类型集合中的一个,你可以使用std::variant&lt;Ts...&gt;。在数学上,它代表有区别/标记的联合。这样,您不需要指针,也不需要基类。例子:

#include <iostream>
#include <variant>

class StringClass {
   std::string getValue() override {
      return "A";
   }
};

class FloatClass {
   float getValue() override {
     return 1;
   }
};

using ClassWithGetValue = std::variant<StringClass, FloatClass>;

class Processor {
   public:
   ClassWithGetValue v;

   void doIt() {
     v = StringClass();
     std::visit([&](auto&& v1) {
       print(v1.getValue());
     });
     v = FloatClass();
     std::visit([&](auto&& v1) {
       print(v1.getValue());
     });
   }

   void print(std::string i) {
     std::cout << "String "<<i<<std::endl;
   }
   void print(float i) {
    std::cout << "Float "<<i<<std::endl;
   }
}

int main() {
   Processor a;
   a.doIt();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多