c++ - mem_fn 到成员的 mem_fn

标签 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因为它似乎无法区分返回 int 的函数。和 int成员变量(在这些行中看到:
        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_fn 的方式来制定调用。来自 IntWrapper直接反对int x变量(没有辅助函数并假设所有成员都是公共(public)的)。
        //int o = maxElem(vec, ???) // what if GetWrappedInt didn't exist?

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

提前致谢!

最佳答案

您不能使用 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。

关于c++ - mem_fn 到成员的 mem_fn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44629067/

相关文章:

c++ - 学习C++,有关环境的问题

jQuery 处理动态添加元素上的事件

c++ - 模板类中没有匹配的函数

c++ - C++为类方法实现超时功能模板

c++ - boost::bind to class member function

c++ - GTK+ 下拉菜单到工具栏项

c++ - MSVC 提示函数指针不是编译时常量

$(window) 上的 jQuery 绑定(bind)/取消绑定(bind) 'scroll' 事件

c++ - 这个套接字绑定(bind)失败了吗?如果是,为什么?

c++ - 通过只读迭代器公开成员数据