C++ 比较器函数向量的默认参数

C++ 比较器函数向量的默认参数,c++,function,compiler-errors,function-pointers,comparator,C++,Function,Compiler Errors,Function Pointers,Comparator,利益函数 我正在尝试编写一个模板化的sortdifferenceways函数,该函数将按照比较器函数的指令对向量进行排序(并打印)。我不确定指示比较器的标准方法是什么,但我同意了 template<typename T> void sortDifferentWays(std::vector<T>& v, std::vector<bool (*)(T,T)> comparators) { for (auto& comparator : c

利益函数

我正在尝试编写一个模板化的
sortdifferenceways
函数,该函数将按照比较器函数的指令对向量进行排序(并打印)。我不确定指示比较器的标准方法是什么,但我同意了

template<typename T>
void sortDifferentWays(std::vector<T>& v, std::vector<bool (*)(T,T)> comparators)
{
    for (auto& comparator : comparators)
    {
        std::sort(v.begin(), v.end(), comparator);
        printVec(v);
    }
}
正如所料。我欢迎关于如何改进此功能的建议,但我的主要问题如下

问题

我现在希望
sortdiffertways
有一个默认的
comparators
参数,其中包含一个函数,该函数可以很好地处理大多数(可能是所有)原语类型

template<typename T>
void sortDifferentWays(std::vector<T>& v, std::vector<bool (*)(T,T)> comparators = {[](const T& left, const T& right) -> bool{return left < right;}})
{
    for (auto& comparator : comparators)
    {
        std::sort(v.begin(), v.end(), comparator);
        printVec(v);
    }
}

int main()
{
    std::vector<X> v = {{1,5},{4,4},{9,2},{4,4},{0,6},{12,2},{11,9}};
    sortDifferentWays(v, {&compare_a, &compare_b});

    std::vector<int> v2 = {4,5,8,3,9,10,2};
    sortDifferentWays(v2);

    return 0;
}
并给出
comparators={&defaultComparator}
,但它也不起作用并产生错误消息

test.cpp:47:70: error: no matching constructor for initialization of 'std::vector<bool (*)(int, int)>'
void sortDifferentWays(std::vector<T>& v, std::vector<bool (*)(T,T)> comparators = {[](const T& left, const T& right) -> bool{return left < right;}})
error: reference to overloaded function could not be resolved; did you mean to call it?
如何创建默认比较器

编辑

我正在编辑

g++ test.cpp -o a -std=c++11
其中
g++
默认为clang(MAC OSX)


我在这个示例中看到了几个问题,但是,您正在搜索的问题与参数
比较器有关

这被定义为
std::vector
,它是函数指针的向量。但是,您尝试使用
{[](const T&left,const T&right)->bool{return left
初始化它。这是lambda的初始值设定项列表,不可转换

这背后的原因是lambda是一种使用
operator()
重载编写类的快速方法

class lambda
{
public:
    template<typename T1, typename T2>
    auto operator()(const T1 &left, const T2 &right) const -> bool { return left < right; }
};
class lambda
{
公众:
模板
自动运算符()(常数T1&左,常数T2&右)常数->布尔{返回左<右;}
};
显然,这个类不能转换为函数指针。 为了处理函数指针和类(又称函子),最好使用
中的类型
std::function
。在您的情况下,
std::function

编辑
Monkey0506指出,如果没有捕获并且lambda具有相同的签名,则可以将lambda转换为函数指针。最后一个不是这种情况,因为lambda的参数是常量引用。

您确定
sortdiffertways(v)
v
而不是
v
Oops!那是个小错误。现在修好了。它解释了许多我未能理解的编译错误。非常感谢。至于其他的,请看我的回答为什么?为什么不使用带有自定义比较函数/lambda的
std::sort
?这就像一行或两行代码,而你的解决方案是一大堆代码要通读却没有明显的收获。你用的是哪种编译器?我不能用gcc或clang复制。我不习惯使用
std::function
。如果您能为
sortdifferenceways
建议一种实现它的方法,那就太好了。从我测试的情况来看,将
std::vector
更改为
std::vector
应该足够了。我不知道这一点,也不会推荐它。虽然在这种情况下,参数不一样。@JVApen许多人会建议不要使用
std::function
,因为它们的重载,这可能会在这里产生一些影响,因为它在
std::sort
中用作比较函数。
error: reference to overloaded function could not be resolved; did you mean to call it?
g++ test.cpp -o a -std=c++11
g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
class lambda
{
public:
    template<typename T1, typename T2>
    auto operator()(const T1 &left, const T2 &right) const -> bool { return left < right; }
};