为什么需要将比较函数类型指定为模板参数? 对于C++中的关联容器,如SET、MAP等,我们需要提供自定义键比较器类型作为模板参数如下: bool compareMyType(const MyType& a, const MyType& b); set<MyType, decltype(compareMyType)*> my_set(compareMyType); // OK set<MyType> my_set(compareMyType); // ERROR

为什么需要将比较函数类型指定为模板参数? 对于C++中的关联容器,如SET、MAP等,我们需要提供自定义键比较器类型作为模板参数如下: bool compareMyType(const MyType& a, const MyType& b); set<MyType, decltype(compareMyType)*> my_set(compareMyType); // OK set<MyType> my_set(compareMyType); // ERROR,c++,stl,C++,Stl,为什么需要这样做?为什么不能通过键的类型推断比较器函数的类型?与函数不同,类模板没有部分推断。如果为类模板提供模板参数,则需要提供所有非默认参数,在set的情况下,需要提供比较类型,因为它默认为std::less,函数指针不能转换为std::less 有人提议进行部分扣减,但被拒绝,目前唯一添加到CTAD的是,它将通过别名工作。,因为比较器甚至不一定是函数指针。事实上,该参数的默认值是std::less,这是一个带有运算符的类模板。但是,您可以通过两个MyType const&传递可以调用的任何

为什么需要这样做?为什么不能通过键的类型推断比较器函数的类型?

与函数不同,类模板没有部分推断。如果为类模板提供模板参数,则需要提供所有非默认参数,在set的情况下,需要提供比较类型,因为它默认为std::less,函数指针不能转换为std::less


有人提议进行部分扣减,但被拒绝,目前唯一添加到CTAD的是,它将通过别名工作。

,因为比较器甚至不一定是函数指针。事实上,该参数的默认值是std::less,这是一个带有运算符的类模板。但是,您可以通过两个MyType const&传递可以调用的任何对象的类型,并返回bool,因此需要指定该对象的实际类型。

您的问题已经得到回答,因此这只是您如何解决该问题的输入:


你可以提供operatorset也可以…你知道它被拒绝的原因吗?@Aconcagua不幸的是我不知道。我想也许吧。是他告诉我部分扣除被取消的。@Aconcagua是的,我稍微修改了一下。
#include <iostream>
#include <set>

struct MyType {
    int value;
};

// added operator<
bool operator<(const MyType& l, const MyType& r) {
    return l.value < r.value;
}

int main() {
    std::set<MyType> my_set = {{3}, {2}, {1}};
    for(const MyType& m : my_set) 
        std::cout << ' ' << m.value;
    std::cout << "\n";
}
 1 2 3