mem_fn 至 mem_fn 成员
mem_fn to mem_fn of member
这是
的后续问题
这是当前代码。
#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_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
应该被视为已弃用,因为据我所知,它没有任何目的,至少不能通过其他方式实现,即 lambda。
这是
的后续问题这是当前代码。
#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_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
应该被视为已弃用,因为据我所知,它没有任何目的,至少不能通过其他方式实现,即 lambda。