如何在函数指针列表上使用std::for_each
How to use std::for_each on a function pointer list
在下面的代码中,如何使用std::for_each指令重写for循环。我试着用boost::lambda::_1
, boost::bind
,但是我不能使它工作。
#include <vector>
#include <iostream>
#include <cstring>
#include <cstdlib>
int main()
{
std::vector<int(*)(const char*)> processors;
processors.push_back(std::atoi);
processors.push_back(reinterpret_cast<int(*)(const char*)>(std::strlen));
const char data[] = "1.23";
for(std::vector<int(*)(const char*)>::iterator it = processors.begin();
it != processors.end(); ++it)
std::cout << (*it)(data) << std::endl;
}
欢迎任何提示来帮助我解决这个问题。
编辑:解决方案
#include <vector>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
int main()
{
std::vector<boost::function<int(const char*)> > processors;
processors.push_back(std::atoi);
processors.push_back(std::strlen);
const char data[] = "1.23";
namespace bl = boost::lambda;
std::for_each(processors.begin(), processors.end(),
std::cout << bl::bind(bl::_1, data) << "n");
}
如果允许boost::lambda
和'n'
而不是endl
,是否下面的代码符合目的吗?
namespace bl = boost::lambda;
std::for_each( processors.begin(), processors.end()
, std::cout << bl::bind( bl::_1, data ) << 'n' );
void blah(int (*func)(const char *), const char *data)
{
std::cout << func(data) << std::endl;
};
...
std::for_each(processors.begin(), processors.end(), boost::bind(blah, _1, data));
您可能会发现使用BOOST_FOREACH:
更容易#include <vector>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <boost/foreach.hpp>
#include <boost/function.hpp>
int main()
{
typedef boost::function<int(const char*)> ProcessorFunc;
std::vector<ProcessorFunc> processors;
processors.push_back(std::atoi);
processors.push_back(std::strlen);
const char data[] = "1.23";
BOOST_FOREACH(ProcessorFunc& proc, processors)
{
std::cout << proc(data) << std::endl;
}
}
或者您可以使用c++ 0x中基于范围的for循环
相关文章:
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- std::memory_order for std::atomic:<T>:wait
- 在基于范围的 for 循环期间插入 std::list 的后面
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 运算符 << 操作加载的 API for std::endl?
- google test PrintTo for std::set<std::string>
- std::memcpy vs std::copy_n for legacy c structs
- C++11 基于范围的 for 循环,用于 std::list
- For-loop或std::any_of,我应该使用哪一个?
- 从 std::ostream 重载 << 运算符时,为什么编译器会给出"too many parameters for this operator function"错误?
- std::hash for std::chrono::duration
- 如何修复以下错误"no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
- 访问类的 std::vector 与 for 循环中的 custum 类对象
- Hash for a std::pair, for use in an unordered_map
- 计算使用 C++ std 函数而不是 for 循环的大 O
- 使用 OpenMP 在并行 for 循环中使用 std::cout
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- C++ SFINAE : is_constructible for const char[] vs std::strin
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错
- 类型安全 - all_of/ any_of/ none_of for std::tuple