mem_fn到成员的mem_fn

时间:2017-06-19 11:12:38

标签: c++ bind member-functions member-variables

这是

的后续问题

mem_fn to function of member object

这是当前的代码。

#include <vector>
#include <algorithm>
#include <functional>

struct Int
{
    Int(int _x = 0) : x(_x) {}
    int GetInt() const { return x; }
    int x;
};

struct IntWrapper
{
    IntWrapper(int _x = 0) : test(_x) {}
    int GetWrappedInt() const { return test.GetInt(); }
    Int test;
};

template<class ContainerT, class Mem> constexpr auto maxElem(const ContainerT& _container, Mem _Pm)
{
    auto memFn = std::mem_fn(_Pm);
    return memFn(std::max_element(_container.cbegin(), _container.cend(), [&](auto _rhs, auto _lhs) { return memFn(_rhs) < memFn(_lhs); }));
}

int main()
{
    {
        std::vector<Int> vec;
        for (int i = 0; i < 10; ++i)
        {
            vec.push_back(i * 11 % 7); // some random values
        }
        int m = maxElem(vec, &Int::GetInt);
        int n = maxElem(vec, &Int::x);
    }

    {
        std::vector<IntWrapper> vec;
        for (int i = 0; i < 10; ++i)
        {
            vec.push_back(i * 7 % 11); // some random values
        }
        int m = maxElem(vec, &IntWrapper::GetWrappedInt);
        //int o = maxElem(vec, ???) // what if GetWrappedInt didn't exist?
    }

    return 0;
}

原始问题是通过x对象检索Int结构的IntWrapper值。我之所以使用mem_fn是因为它似乎无法区分返回intint成员变量的函数(在这些行中看到:

        int m = maxElem(vec, &Int::GetInt);
        int n = maxElem(vec, &Int::x);

IntWrapper个对象的解决方案是添加.test

auto y = std::mem_fn(&Int::GetInt);
auto b = y(wrapper.test);

致电。但是,在maxElem函数中,我不能这样做。

我想知道是否有办法以mem_fnIntWrapper对象直接转到int x变量的方式来制定呼叫(没有辅助函数并假设所有成员都是公共的。)

        //int o = maxElem(vec, ???) // what if GetWrappedInt didn't exist?

最初的方法是auto y = std::mem_fn(&IntWrapper::test.GetInt); // ERROR,当然不能编译,但显示了这个想法。

提前致谢!

1 个答案:

答案 0 :(得分:1)

您不能将std::mem_fn与指向成员的指针(例如指向成员成员的指针)不同。所以,你必须使用它。在您的特定情况下,您可以使用

实现这一目标
std::vector<IntWrapper> vec;
for (int i = 0; i < 10; ++i)
{
    vec.push_back(i * 11 % 7); // some random values
}
auto m = maxElem(vec, &IntWrapper::GetWrappedInt);

但是,我强烈建议您尽可能使用 lambda表达式std::mem_fn应被视为已被弃用,因为,AFAIK,它没有任何目的,至少也不能通过其他方式实现,即lambda。