FP编程实践:在C++0x中模拟F#的List.map和List.choose库函数

来源:互联网 发布:淘宝网店开店方案 编辑:程序博客网 时间:2024/05/18 12:34
 

F#代码

C++代码

#include <iostream>#include <list>#include <string>#include <algorithm>#include <boost/assign.hpp>#include <boost/optional/optional.hpp>#include <boost/spirit/home/karma.hpp>using namespace std;using namespace boost::assign;using boost::optional;namespace fsharp_list{template<typename Fn, typename T>auto map(Fn mapping, list<T> const& list1) -> list<decltype(mapping(declval<T>()))>{list<decltype(mapping(declval<T>()))> list_result(list1.size());transform(list1.cbegin(), list1.cend(), list_result.begin(), mapping);return list_result;}template<typename Fn, typename T>auto choose(Fn chooser, list<T> const& list1) -> list<typename remove_reference<decltype(*chooser(declval<T>()))>::type>{list<typename remove_reference<decltype(*chooser(declval<T>()))>::type> list_result;for_each(list1.cbegin(), list1.cend(),[&](T const& elem){if(auto v = chooser(elem))list_result.push_back(*v);});return list_result;}}namespace std{namespace karma = boost::spirit::karma;template<typename T>ostream& operator<<(ostream& os, list<T> const& list1){return os << karma::format('[' << -(karma::auto_ % "; ") << ']', list1);}}int main(){list<int> list1 = list_of(1)(2)(3);auto newList = fsharp_list::map([](int x){return x + 1;}, list1);cout << newList << endl;//[2; 3; 4]list<string> listWords = list_of<string>("and")("Rome")("Bob")("apple")("zebra");auto isCapitalized = [](string const& str){return str[0] >= 'A' && str[0] <= 'Z';};auto results = fsharp_list::choose([&](string const& elem){return isCapitalized(elem) ? optional<string>(elem) : optional<string>();}, listWords);cout << results << endl;//["Rome"; "Bob"]}
原创粉丝点击