閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

オーバーロード関数をアルゴリズムに渡す

高階関数へオーバーロードされた関数を渡す - Faith and Brave - C++で遊ぼう

関数オブジェクトをかますとキャストが不要になるようです。余計回りくどくなっている気もしますが……。

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

double stod(const std::string& s) { return atof(s.c_str()); }
double stod(const std::wstring& s) { return wcstof(s.c_str(), 0); }

struct stod_adapter
{
  template<class T>
  double operator()(const T& s) { return stod(s); }
};

int main()
{
    string ar[] = {"3.14", "1.23", "5.67"};

    vector<double> v;
    //transform(ar, ar + 3, back_inserter(v), &stod); // エラー!あいまいな関数を指定した
    transform(ar, ar + 3, back_inserter(v), stod_adapter());

    return 0;
}

gcc(g++)には _wotf がなかったので wcstof で代用しています。一応動いている様子。