c++ - mem_fn 到 member 的 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;
}

最初的问题是关于通过 IntWrapper 对象检索 Int 结构的 x 值。我为此使用了 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_fnIntWrapper 对象直接到 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 应该被视为已弃用,因为据我所知,它没有任何目的,至少不能通过其他方式(即 lambda)实现。

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

相关文章:

C++ 为什么可以初始化一个空字符串数组?

javascript 对象 - 如何绑定(bind)到 "this"

c++ - std::bind,无法使具有单个参数的方法起作用

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

C++ 重载 + 运算符只有成员函数用于添加带有整数的类对象

c++ - 为什么调用从对象移出的析构函数?

c++ - 使用linux perf和不同的调用图模式对程序进行性能分析会得出不同的结果

java - 为什么不同的 DatagramSocket 构造函数的行为如此不同? (绑定(bind)异常)

c++ - 是否有一种巧妙的方法来避免覆盖模板基类的所有纯虚函数,用于多重继承

c++ - 范围内的引用