C++11 std中嵌套类型的部分专门化

C++11 std中嵌套类型的部分专门化,c++11,C++11,考虑在C++11中简化链表实现 template<typename T> struct list { struct node { T value; std::unique_ptr<node> next; }; std::unique_ptr<node> root; }; 所有节点都是std::unique\u ptr。这很好,但是我必须为我拥有的每一个std::unique\u ptr编写更多的

考虑在C++11中简化链表实现

template<typename T>
struct list
{
    struct node
    {
        T value;
        std::unique_ptr<node> next;
    };
    std::unique_ptr<node> root;
};
所有节点都是
std::unique\u ptr
。这很好,但是我必须为我拥有的每一个
std::unique\u ptr
编写更多的代码。相反,我可以部分地专门化std::default\u delete

namespace std
{
template<typename T>
struct default_delete<typename list<T>::node>
{
    void operator()(typename list<T>* node) const
    {
    }
};
}

一个简单的解决方法是为该类型编写using声明:

using node_ptr = std::unique_ptr<node, my_list_delete<node>>;
使用node_ptr=std::unique_ptr;

一个简单的解决方法是为该类型编写一个using声明:

using node_ptr = std::unique_ptr<node, my_list_delete<node>>;
使用node_ptr=std::unique_ptr;
您可以“取消”内部类:

template <typename T> struct list_node {
    T value;
    std::unique_ptr<node> next;
};

template<typename T> struct list {
    using node = list_node<T>;
    std::unique_ptr<node> root;
};

namespace std {
    template<typename T> struct default_delete<list_node<T>> {
        void operator()(typename list<T>* node) const { }
    };
}

default_delete<list<T>::node>()(...); // works
模板结构列表\u节点{
T值;
std::unique_ptr next;
};
模板结构列表{
使用节点=列表\节点;
std::唯一的_ptr根;
};
名称空间标准{
模板结构默认值\u删除{
void运算符()(类型名列表*节点)常量{}
};
}
默认删除()(…);//作品
您可以“取消”内部类:

template <typename T> struct list_node {
    T value;
    std::unique_ptr<node> next;
};

template<typename T> struct list {
    using node = list_node<T>;
    std::unique_ptr<node> root;
};

namespace std {
    template<typename T> struct default_delete<list_node<T>> {
        void operator()(typename list<T>* node) const { }
    };
}

default_delete<list<T>::node>()(...); // works
模板结构列表\u节点{
T值;
std::unique_ptr next;
};
模板结构列表{
使用节点=列表\节点;
std::唯一的_ptr根;
};
名称空间标准{
模板结构默认值\u删除{
void运算符()(类型名列表*节点)常量{}
};
}
默认删除()(…);//作品

那会管用,但我更感兴趣的是
std::default\u delete
解决方案那会管用,但我更感兴趣的是
std::default\u delete
解决方案