【问题标题】:Contain templated data without using templated class包含模板化数据而不使用模板化类
【发布时间】:2020-08-17 05:12:30
【问题描述】:

我有以下基本结构:

template<typename T>
class A {
    T data;
};

class B {
    A data; // no template parameters
};

class B 中的数据可以有任何模板参数,但我不想模板B,这是解决A data 的声明没有参数这一事实的一种方法。 有没有办法做到这一点,或者必须将B 模板化?

【问题讨论】:

  • 如果您要求我认为您要求的内容,很可能您希望B 包含任何类型。或者B 是多态的。有几种方法可以做到这一点。第一次使用std::any,第二次使用std::variant。或者使用B(带有模板参数)但继承自非模板基类(也称为多态继承),这可能是首选,但需要您了解如何进行类多态。

标签: c++ class templates member class-template


【解决方案1】:

不是直接的方式,但您可以使用 std::any(需要 或更高版本的支持)作为 B 类的成员来实现。

#include <any>
#include <type_traits>

template<typename T>
class A {
   T data;
};

// traits for checking template class instance of A
template <typename T> struct is_class_A : public std::false_type {};
template <typename T> struct is_class_A<A<T> > : public std::true_type {};

class B
{
   std::any mData;

public:
   // templates class constructor for any data
   template<typename T> B(T const& data)
      : mData{ data }
   {
      // to restrict B having the data other than A<T> s
      static_assert(is_class_A<T>::value);
   }
};

现在你可以了。

A<int> aObject;
B object{ aObject }; // works

// B object2{ 1 };   // compiler error

See live demo

【讨论】:

    【解决方案2】:

    在您的代码中,A 不是一个类,它是一个类模板。因此,您不能声明A 类型的变量,因为A 不是类型。您必须在B 中为data 提供模板参数:

    template<typename T>
    class B{
        A<T> data;
    };
    
    // ---- OR ---- //
    
    class B{
        A<int> data; //int is only an example, you can use any type
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      相关资源
      最近更新 更多