包含模板化数据而不使用模板化 class

Contain templated data without using templated class

我有以下基本结构:

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

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

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

在您的代码中,A 不是 class,而是 class 模板。因此,您不能声明 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
};

不是直接的方法,但您可以使用 std::any(which required 或更高版本的支持)作为 B class 的成员。

#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