使用不完整类型为void的模板类

时间:2016-06-09 19:19:29

标签: c++ templates

我有以下模板类:

template <typename T>
class myClass
{
public:
    // Many methods...
protected:
private:
    T attribute
    // Other attributes.
};

由于myClass<void>,实例化void attribute类型的对象不起作用。 你可以给我一些提示,以便能够使用myClass<void>类型的对象而无需专门研究整个班级。由于它有许多依赖于类型T的成员函数,因此专门化会导致代码重复。

2 个答案:

答案 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.
};

然后至少你不必再次复制整个课程。

但它可能没有多大意义,因为你肯定想在某个地方使用这种类型。所以你必须进一步专注于那些地方。