类定义如下:
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':部分特化不能有依赖的非类型模板参数
根据标准这是合法的还是我误解了下面的答案?
答案 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>
}