使用函数指针定制std :: set comparator

时间:2015-09-28 04:00:54

标签: c++

我是否可以声明一个带有函数指针的集合作为其比较器作为数据成员?

bool lex_compare (const int& lhs, const int & rhs){
       return true;
    };

// So I can define a std::set testSet using function pointer:
set<int, bool(*)(const int & lhs, const int & rhs)> testSet (&lex_compare);

我的问题是我应该如何使用函数指针作为比较器来声明和定义testSet作为数据成员?

注意:我知道仿函数可以解决我的问题:

struct lex_compare {
    bool operator() (const int& lhs, const int& rhs) const{
        return ture;
    }
};

set<int, lex_compare> testSet;

如果函数指针有办法,我感兴趣。

2 个答案:

答案 0 :(得分:4)

  

我的问题是我应该如何使用函数指针作为比较器来声明和定义testSet作为数据成员?

你可以像你一样声明它,

set<int, bool(*)(const int &, const int &)> testSet;

您可以在构造函数的成员初始化列表中初始化它。

MyClass::MyClass() : testSet (&lex_compare) { ... }

<强>推荐

您可以将lex_compare简化为:

bool lex_compare (int lhs, int rhs){ ... }

答案 1 :(得分:1)

如果你在课堂上这样做,它基本相同:

struct MyClass {
    static bool lex_compare (const int& lhs, const int & rhs){
           return ...;
        };

    set<int, bool(*)(const int & lhs, const int & rhs)> testSet;

    MyClass()
    : testSet(&lex_compare)
    {
    }
};

使lex_compare函数成为静态函数使其成为常规函数,以便您可以获得指向它的常规函数​​指针。

使用C ++ 11或更高版本,可以简化:

struct MyClass {
    static bool lex_compare(const int& lhs, const int & rhs){
           return ...;
        };

    set<int, decltype(&lex_compare)> testSet {lex_compare};
};

如R Sahu所述,使用普通整数作为参数更好,因此这变为:

struct MyClass {
    static bool lex_compare(int lhs, int rhs) { return ...; }
    set<int, decltype(&lex_compare)> testSet {lex_compare};
};