C++ 包含模板化数据而不使用模板化类

C++ 包含模板化数据而不使用模板化类,c++,class,templates,member,class-template,c++17,C++,Class,Templates,Member,Class Template,C++17,我有以下基本结构: template<typename T> class A { T data; }; class B { A data; // no template parameters }; 模板 甲级{ T数据; }; B类{ A data;//没有模板参数 }; class B中的数据可以有任何模板参数,但我不想模板化B,这将是修复A data的声明没有参数这一事实的一种方法。 有没有办法做到这一点,或者必须将B模板化?在您的代码中,a不是类,而是类模

我有以下基本结构:

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

class B {
    A data; // no template parameters
};
模板
甲级{
T数据;
};
B类{
A data;//没有模板参数
};
class B
中的数据可以有任何模板参数,但我不想模板化
B
,这将是修复
A data
的声明没有参数这一事实的一种方法。
有没有办法做到这一点,或者必须将
B
模板化?

在您的代码中,
a
不是类,而是类模板。因此,不能声明
a
类型的变量,因为
a
不是类型。必须为
B
中的
数据提供模板参数:

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

// ---- OR ---- //

class B{
    A<int> data; //int is only an example, you can use any type
};
模板
B类{
A数据;
};
//----或--//
B类{
A data;//int只是一个示例,可以使用任何类型
};

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

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

// ---- OR ---- //

class B{
    A<int> data; //int is only an example, you can use any type
};
模板
B类{
A数据;
};
//----或--//
B类{
A data;//int只是一个示例,可以使用任何类型
};

这不是一个简单的方法,但是您可以使用
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);
   }
};

#include

不是一个简单的方法,但是您可以使用
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);
   }
};

#include

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