【问题标题】:Template pointer to a member function - getter指向成员函数的模板指针 - getter
【发布时间】:2020-09-20 22:02:53
【问题描述】:

所以我正在制作一个排序功能,我希望它根据我给它的 getter 对我的元素进行排序。 问题是我的吸气剂是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 一起工作

【问题讨论】:

    标签: c++ pointers templates getter member


    【解决方案1】:

    只需将参数设为 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的签名中。

    【讨论】:

    • @MaximYarmolik • C++ 是一门硬语言。一种复杂的语言。一种非常庞大的语言(核心语言 + 标准库)。它有很多锋利的边缘。很多怪癖。很多奇怪的语法,因为它为向后兼容做出了巨大的努力。一种使用良好、流行的语言——它既是一种祝福(大量资源;你可以使用它找到工作)和诅咒(该语言因遗留问题而被“保留”;进化得益于声音的合唱和顾虑)。
    • 我明白:) 但这一刻非常明显。我什至不知道为什么我没有想到这一点。我只需要把这个词放在同一个地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2012-07-05
    • 1970-01-01
    • 2023-03-28
    • 2011-12-09
    • 2012-05-21
    相关资源
    最近更新 更多