Lig*_*ica 3 c++ boost boost-bind c++03
我有一个像这样的对象类型:
struct T
{
int x;
bool y;
};
Run Code Online (Sandbox Code Playgroud)
和他们的容器像这样:
std::vector<T> v;
Run Code Online (Sandbox Code Playgroud)
和强烈的愿望来决定- 在单个语句 -任何元素是否v有y == true.这可能涉及到std::find_if.
我的理解是,std::bind并且boost::bind适用于成员函数,不能应用于成员数据.
因为我不喜欢他们,我希望避免:
因为我的环境是C++ 03,所以以下内容不可用:
我的理解是,
std::bind并且boost::bind适用于成员函数,不能应用于成员数据.
值得注意的是,事实并非如此!boost::bind将很高兴地绑定到成员数据,并允许您在"内联迭代"期间对其执行操作.
从文档:
指向成员函数和指向数据成员的指针不是函数对象,因为它们不支持
operator().为方便起见,bind接受成员指针作为其第一个参数,行为就像使用boost :: mem_fn将成员指针转换为函数对象一样.换句话说,表达Run Code Online (Sandbox Code Playgroud)bind(&X::f, args)相当于
Run Code Online (Sandbox Code Playgroud)bind<R>(mem_fn(&X::f), args)其中R是X :: f的返回类型(对于成员函数)或成员的类型(对于数据成员).
另外,从以下文档boost::mem_fn:
mem_fn还支持指向数据成员的指针,将它们视为不带参数的函数,并返回对该成员的(const)引用.
所以,你可以这样做:
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <boost/bind.hpp>
struct T
{
int x;
bool y;
};
void f(const std::string& name, const std::vector<T>& v)
{
const bool found = std::find_if(
v.begin(),
v.end(),
boost::bind(&T::y, _1) == true
) != v.end();
std::cout << name << ": " << (found ? " FOUND" : " not found") << '\n';
}
int main()
{
T a = { 0, false };
T b = { 1, false };
T c = { 2, true };
std::vector<T> v;
f("a", v);
v.push_back(a);
v.push_back(b);
f("b", v);
v.push_back(c);
f("c", v);
}
Run Code Online (Sandbox Code Playgroud)
输出:
a:未找到
b:未找到
c:FOUND
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |