C++ 如何使用boost::bind从参数中动态提取数据

C++ 如何使用boost::bind从参数中动态提取数据,c++,c++11,boost,C++,C++11,Boost,假设您正在将函数传递给函数: foo(boost::bind( &CLASS_NAME::OnValueChanged, this, _1)); 但问题是\u 1类型可能会有所不同,我实际上并不需要它,只需要它的一个数据。所以我想写这样的东西: foo(boost::bind( &CLASS_NAME::OnValueChanged, this, _1.GetName())); 因为无论\u1是什么类型,我都知道每次它都有GetName()方法,并且结果类型是相同的(wstr

假设您正在将函数传递给函数:

foo(boost::bind( &CLASS_NAME::OnValueChanged, this, _1));
但问题是
\u 1
类型可能会有所不同,我实际上并不需要它,只需要它的一个数据。所以我想写这样的东西:

foo(boost::bind( &CLASS_NAME::OnValueChanged, this, _1.GetName()));
因为无论
\u1
是什么类型,我都知道每次它都有
GetName()
方法,并且结果类型是相同的(
wstring

怎么做


另外,在我的例子中,持有
GetName
的类型是一个模板。

您只需要另一个绑定

foo(boost::bind( &CLASS_NAME::OnValueChanged, this, boost::bind(GetNameFunctor(), _1));
GetNameFunctor()的通用实现如下所示:

struct GetNameFunctor {
     typedef std::string result_type;

     template <typename T> std::string operator()(T const& o) const {
         return o.GetName();
     }
};
struct GetNameFunctor{
typedef std::字符串结果类型;
模板std::字符串运算符()(T常量和o)常量{
返回o.GetName();
}
};
如果你想在这里得到更多的控制/支持,你可以看看


谢谢!有可能用lambda来做吗(我的意思是,得到名字)?我更愿意让代码尽可能接近执行。假设你指的是c++11 lambdas,是的,如果你的类共享一个多态库。否则,您需要多态lambda(c++14),它实际上是所示
GetNameFunctor
的语法糖。(如果你的意思是
boostlambda
,那么,是的,你可以,但我不建议与boostbind混合。)
\u1
不会每次调用都更改,我有几个
foo
并且它们从
foo1
foo2
更改为
fooN
。我是说C++11 lambdas,你能分享一下代码吗?
boost::bind([](MyFixedType const&o){return o.GetName();},_1)
。根据您的平台/编译器,您可能需要定义BOOST\u RESULT\u OF\u USE\u DECLTYPE。老实说,在这种情况下,您可能只会使用
std::memfn(&MyFixedType::GetName)
bind
。我认为在C++14中更易于阅读,可以执行
foo([this](auto&&o){returnonvaluechanged(o.GetName());})