我有以下模板类:
template <typename T>
class myClass
{
public:
// Many methods...
protected:
private:
T attribute
// Other attributes.
};
由于myClass<void>
,实例化void attribute
类型的对象不起作用。
你可以给我一些提示,以便能够使用myClass<void>
类型的对象而无需专门研究整个班级。由于它有许多依赖于类型T的成员函数,因此专门化会导致代码重复。
答案 0 :(得分:3)
创建一个包含属性的模板化基类,将其专门化为void
并从中继承:
namespace detail //Warn end user that he should not use stuff from here
{
template <typename T>
struct myClass_base
{
T attribute;
};
template <>
struct myClass_base<void>
{}; //No attribute at all
}
template <typename T>
class myClass: private detail::myClass_base<T>
{
//rest of definition
};
当使用myClass
类型
attribute
时,这会使void
缺少{{1}}字段
答案 1 :(得分:2)
您可以使用自定义类型并将其专门化来推迟整个问题:
template<typename T>
struct my_type_t
{
using type = T;
};
template<>
struct my_type_t<void>
{};
template<typename T>
using my_type = typename my_type_t<T>::type;
template <typename T>
class myClass
{
public:
// Many methods...
protected:
private:
my_type<T> attribute
// Other attributes.
};
然后至少你不必再次复制整个课程。
但它可能没有多大意义,因为你肯定想在某个地方使用这种类型。所以你必须进一步专注于那些地方。