指向成员函数的模板指针-Getter

时间:2020-06-02 12:23:18

标签: c++ pointers templates getter member

所以我正在做一个排序函数,我希望它根据我给的吸气剂对我的元素进行排序。 问题是我的吸气剂是const,这就是为什么我当前的代码不起作用的原因。如果我删除const,就可以了。

struct User {
    string name;
    string getX() const { return name; } //// doesnt work with this
    string getX() { return name; }       //// this works fine. but i need my getter to be const
};

template <typename ElemType, typename MemberType>
void _sort(std::vector<ElemType>& vec, MemberType(ElemType::* member)(), bool ascending = true)
{
    for (int j = 0; j < vec.size() - 1; ++j)
        for (int i = 0; i < vec.size() - j - 1; ++i)
            if (((vec[i].*member)() < (vec[i + 1].*member)()) ^ ascending)
                swap(vec[i], vec[i + 1]);
}

int main()
{
    vector<User> a{ User{"Z"}, User{"E"}, User{"B"}, User{"R"}, User{"A"} };

    for (auto e : a)
        cout << e.name << " ";
    cout << endl;

    _sort(a, &User::getX);

    for (auto e : a)
        cout << e.name << " ";
    cout << endl;

    return 0;
}

我该怎么做才能使其与const getter一起使用

1 个答案:

答案 0 :(得分:3)

只需将参数设置为const

template <typename ElemType, typename MemberType>
void _sort(std::vector<ElemType>& vec, MemberType(ElemType::* member)() const, bool ascending = true)
________________________________________________________________________^^^^^

或者不要设置特定的参数:

template <typename ElemType, typename MemberType>
void _sort(std::vector<ElemType>& vec, MemberType member, bool ascending = true)

如果getter不是const,则前者将不起作用,而后者将对任何东西都起作用。如果您为后者传递了一个无法调用的函数,例如(vec[i].*member)(),则将出现编译错误,而不是_sort的签名中。

相关问题