ゆとりーなの日記

日記的な事を書いて行くと思はれる

csvファイルをコンパイル時にごにょごにょする

次の様なcsvファイル、"test.csv"があったとします。

8,4,35,23,12,6,18,24,56

これの要素の合計と昇順ソートをコンパイル時にやってしまおうというわけです。

#include <iostream>
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/sort.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/plus.hpp>

const struct {
  template <typename Int>
  void operator ()(const Int &) const {
    std::cout << Int::value << std::endl;
  }
} disp = {};

typedef boost::mpl::vector_c<int, 
                             #include "test.csv"
                             > list;

int main() {
  const int test_csv_sum = boost::mpl::fold<list, boost::mpl::int_<0>, boost::mpl::plus<>>::type::value;
  std::cout << "合計:" << test_csv_sum << std::endl;
  std::cout << "ソート結果:" << std::endl;
  boost::mpl::for_each<boost::mpl::sort<list>::type>(disp);
  return 0;
}

以下出力です。

合計:186
ソート結果:
4
6
8
12
18
23
24
35
56

#includeを使ってmplのvector_cに要素をぶち込むのがミソです。あとは普通のmplのアルゴリズムを使って合計とソートをやってしまえばいいわけです。
流石にソートでは元のcsvの中身を書き換えることはできません。あくまでソート済み結果をコンパイル時に型として作って保持することが出来るだけですね。