【问题标题】:How to make a class that holds a value whose type isn't know yet?如何创建一个包含类型未知的值的类?
【发布时间】:2014-05-20 00:53:15
【问题描述】:

我想要一个类来保存一个类型可以变化的数据成员。比如:

struct container
{
    void push( auto x );
private:
    auto m_x;
};

直到我打电话给push() 才知道类型。我该怎么做?

【问题讨论】:

标签: c++ templates


【解决方案1】:
template<typename T>
struct container
{
    void push(T x);
private:
    T m_x;
};

【讨论】:

  • 直到我打电话给push&lt;T&gt;()时才知道类型。
  • 该类在调用其成员函数时必须被实例化,所以在调用push之前基本上必须知道m_x的类型
  • 可以对成员函数进行模板化。您不必模板化整个班级。但是,如果类成员依赖于方法的类型,那么是的,您必须模板化整个类。
  • @RemyLebeau 是的,但是成员变量被模板化以接收推送中的元素。这必须在实例化时定义。
  • @templateboy 你可能会发现 boost::any boost.org/doc/libs/1_55_0/doc/html/any.htmlboost::variant boost.org/doc/libs/1_55_0/doc/html/variant.html 有帮助
【解决方案2】:

在 C++ 中,不可能实现一个包含类型可以变化的数据成员的类。

根据您的具体需求,我们提供以下解决方案:

  • 实现类模板。实例化类模板以获取 您需要的课程。
  • 使用指针或引用作为数据成员。

这两种解决方案都存在不足之处;这取决于哪个更适合的确切问题。

【讨论】:

    【解决方案3】:

    你可以试试boost::any,它可以让你存储任何类型,但以后的检索和使用必须知道实际类型(它可能会尝试特定类型,通过潜在类型列表工作......)。

    如果您可能需要存储任何类型,但稍后在检索期间只需要对值执行某些操作(例如,将值流式传输到 std::ostream,将其添加到另一个这样的值,...),您可以将这些操作捕获为指向函数模板实例化的指针,或者通过实例化一个类模板,其中操作是基类方法的覆盖,这样您的容器就可以存储指向基类的指针并使用运行时多态性进行调度。

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多