包含模板化数据而不使用模板化 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 c++17 或更高版本的支持)作为 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
我有以下基本结构:
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 c++17 或更高版本的支持)作为 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