如何在函数指针列表上使用std::for_each

How to use std::for_each on a function pointer list

本文关键字:std for each 函数 指针 列表      更新时间:2023-10-16

在下面的代码中,如何使用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循环