1

私の目標は、入力オブジェクトと関数オブジェクトのstd::vectorを入力として受け取るテンプレート関数を作成することでした。このテンプレート関数は、関数オブジェクトとスレッドプールを使用して、入力ベクトルを変換されたオブジェクトのstd::vectorに変換します。

以下に含まれるサンプルコード。

最初にローカル関数オブジェクトを作成してから、すべてのテンプレートパラメーターを渡すよりも短い構文を使用できるようにしたいと思います。

gccでコンパイルします:g ++ -std = C ++ 0x bla.cpp

#include <vector>
#include <functional> 
#include <iostream>

// SYNTAX:
// vector<ResultType> transformed = multiTransform(const vector<InputType>, Transform t)
// where Transform t takes a single InputType as an argument
// ConvertedType has to be default constructible
template <class ConvertedType, class InputType, class Transform>
std::vector<ConvertedType> multiTransform(const std::vector<InputType>& inputs, Transform t) {
  std::vector<ConvertedType> results(inputs.size());
  {
    // boost::threadpool::pool pool(boost::thread::hardware_concurrency());
    for(auto it = inputs.begin(); it != inputs.end(); ++it){
      auto inputDereferenced = *it;
      auto functor = [&, it, inputDereferenced](){
        auto result = t(inputDereferenced);
        results[it - inputs.begin()] = std::move(result);
      };
      // pool.schedule(functor);
      functor();
    }
  }
  return results;
}

int main() {
  std::vector<int> input = {1,2,3};
  // auto output = multiTransform(input, [](int a){return float(a);}); // does not compile
  auto lambda = [](int a){return a/2.0;};
  auto output = multiTransform<float, int, decltype(lambda)>(input, lambda);

  for(auto it : output){
    std::cout << it << std::endl;
  }
}
4

1 に答える 1

3

これは、g++4.6.3で機能します。

auto output = multiTransform<float>(input, [](int a){return a/2.0;});

テンプレート宣言をもう少し洗練されたものにすることもできます。

template <class InputType, class Transform>
auto
multiTransform(const std::vector<InputType>& inputs, Transform t)
  -> std::vector<decltype(t(*inputs.begin())) >
{
  typedef decltype(t(*inputs.begin())) ConvertedType;
  std::vector<ConvertedType> results(inputs.size());
  {
    // boost::threadpool::pool pool(boost::thread::hardware_concurrency());
    for(auto it = inputs.begin(); it != inputs.end(); ++it){
      auto inputDereferenced = *it;
      auto functor = [&, it, inputDereferenced](){
        auto result = t(inputDereferenced);
        results[it - inputs.begin()] = std::move(result);
      };
      // pool.schedule(functor);
      functor();
    }
  }
  return results;
}

その後、あなたは使用することができます

auto output = multiTransform(input, [](int a){return a/2.0;});
于 2012-04-27T12:48:22.600 に答える