如何专门化一个具有指向成员参数的指针的模板类?

时间:2014-03-08 11:06:00

标签: c++ templates template-specialization

类定义如下:

template<typename T, list_node T::* node> class linked_list
{
    // ...
};

可以实例化为:

linked_list<foo, &foo::node> list;

但是我想要一种允许用户实例化的方法如下:

linked_list<foo> list2;

并且具有linked_list类的特化,其工作方式不同。任何人都可以告诉我这是否可能,如果是的话,该如何做?

[编辑]

template<typename T, list_node T::* node = nullptr> struct linked_list
{
};

接下来是:

template <typename T> struct linked_list<T, nullptr>
{
};

在VS2013中给我一个错误:

错误C2754:'linked_list':部分特化不能有依赖的非类型模板参数

根据标准这是合法的还是我误解了下面的答案?

1 个答案:

答案 0 :(得分:1)

要允许一个模板参数,您需要将第二个参数默认为某个参数,例如nullptr

template<typename T, list_node T::* node = nullptr> class linked_list;

现在,您可以专门化第二个模板参数为linked_list<T, nullptr>时使用的nullptr模板:

template<typename T> class linked_list<T, nullptr>;

以上专业化不起作用。另一种专业化方法(完整的工作示例):

struct list_node {};

struct X { list_node node; };

template<typename T, list_node T::*P, bool Special>
struct linked_list_ {};

template<typename T, list_node T::*P>
struct linked_list_<T, P, true> {};

template<typename T, list_node T::*P = nullptr>
struct linked_list
    : linked_list_<T, P, static_cast<list_node T::*>(nullptr) == P>
{};

int main() {
    linked_list<X, &X::node> a; // uses linked_list_<T, P, false>
    linked_list<X> b;           // uses linked_list_<T, P, true>
}