C++ 使用模板集合的不同排序方法

C++ 使用模板集合的不同排序方法,c++,list,sorting,templates,C++,List,Sorting,Templates,我很抱歉,如果这个论坛上已经存在类似的问题,如果可以,请给我链接 我有一个模板类 template<typename type> class DoublyLinkedList {}; 模板 类双链接列表{}; 我想在其中包含排序方法 template<typename type> class DoublyLinkedList { public: void Sort(){} }; 模板 类双链接列表 { 公众: void Sort(){} }; 但列表是一个模板

我很抱歉,如果这个论坛上已经存在类似的问题,如果可以,请给我链接

我有一个模板类

template<typename type>
class DoublyLinkedList {};
模板
类双链接列表{};
我想在其中包含排序方法

template<typename type>
class DoublyLinkedList
{
public:

void Sort(){}

};
模板
类双链接列表
{
公众:
void Sort(){}
};
但列表是一个模板,所以它可以包含不同的类型。那么我如何为我预见的所有类型创建方法呢?我试着这样做:

template<typename type>
class DoublyLinkedList
{
public:

void DoublyLinkedList<int>::Sort(){}
void DoublyLinkedList<string>::Sort(){} 

};
模板
类双链接列表
{
公众:
void DoublyLinkedList::Sort(){}
void DoublyLinkedList::Sort(){}
};

但这是错误的。请提供帮助。

标准库通常处理此问题的方式是允许用户指定自己的比较函数。您可以添加一个模板化参数,您的类型的用户可以使用该参数来提供比较函数,就像这样。在sort的实现中,您假设
comparer
是一个函数,它比较列表中的两个元素,并返回第一个元素是否应该在第二个元素之前

#include <string>
template<typename type>
class DoublyLinkedList
{
public:
    template<class Comp>
    void Sort(Comp comparer);

};

void foo(DoublyLinkedList<std::string> & list)
{
    // Sort list by length of strings
    list.Sort([](const std::string p_left, const std::string p_right){
        return p_left.size() < p_right.size();
    });
}
#包括
模板
类双链接列表
{
公众:
模板
无效排序(Comp比较器);
};
void foo(双链接列表和列表)
{
//按字符串长度对列表排序
list.Sort([](常量std::string p_left,常量std::string p_right){
返回p_left.size()你可以像它那样做。只使用标准C++容器。堆栈溢出不是一个“论坛”。@ChristianHackl所以,不可能这样做?我想有自己的实现。我知道我可以用一种方法实现,然后再识别列表的类型,但我问了两种方法。@Michael:当然可以。见@NathanOliver的评论。像
std::list
那样操作,并允许用户提供默认为
std::less
的functor。但这是一件完全没有意思的事情,因为它重新发明了轮子,是一个不如
std::list
的解决方案,除了扔掉它并使用
std::list
之外,没什么可做的。我会默认将
compare
std::less
进行比较,这样您就不必总是提供一个functor。您的代码看起来非常清晰和专业,您对此有何看法?我知道这个代码很糟糕。@Michael,这种方法在实践中是行不通的。它只在支持的类型具有兼容接口时才起作用。这意味着您只能对适用于
int
std::string
和您选择支持的所有其他类型的
type
执行操作。请记住,即使只使用了一个分支,它们都必须针对您支持的所有
类型进行编译。例如,在
string
的情况下,您无法访问字符,因为当您尝试使用
int
实例化时,它将无法找到类型
int
运算符[]
@Michael,我已经修改了您的示例,以说明它无法工作的原因@好的,谢谢!你能告诉我,在Sort()方法中,我必须用lambda对int进行排序吗?如果我将lambda作为参数:并且我不知道如何在Sort()中使用它。