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();
}
};
如果你想在这里得到更多的控制/支持,你可以看看
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());})代码>