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
(带模板参数),但继承自非模板基类(也称多态继承),这可能是首选,但需要您了解如何进行类多态性。