我正在家里写一些scala,以便在前一天晚上好好想想,如果我们在C ++中使用这种API,那么它会不会很酷? - 有可能吗?"。我开始搜索c ++,monads和stl集合,但是找不到任何可能真正提高我生产力的东西:/。
所以我开始实施一些概念验证(超低效率,但至少它可以工作!:))用于通常在更专用的函数式语言中看到的内容。
auto m = monadic(std::vector<int>{1,2,3});
auto mMapped = m.map([](int x) {return x*x; });
Monadic<std::vector<int>> mFiltered = m.filter([](int x) {return x > 1; });
std::vector<std::string> funList =
monadic(src)
.flatMap([](int x) { return std::vector<int>{1,2,3};} )
.filter([](int x) { return x > 1; })
.map([](int x) { return std::to_string(x).append("_string"); })
.col;
我真的很喜欢这样一个库(但是使用移动语义更加完整和高效)我的日常c ++代码(数据管理,线程和分布式执行变得如此简单)。
问题: - &GT;你知道C ++ 11或C ++ 14的任何这样的库吗? &LT; -
上面的代码使用了一个很快被黑客攻击的PoC库我放在这里https://github.com/GiGurra/cpp_monad(用gcc 4.9.2测试它,VS2015和某些版本的clang,不记得)。
&#34; Monadic&#34; class不包含任何特定的实现,它只是传递给任何map / filter / flatMap自由函数可用于给定的集合类型,例如map操作非常天真地实现,如:
class Monadic {
public:
...
template <typename MapFcn>
auto map(MapFcn mapFcn) { return monadic(cpp_monad::map(col, mapFcn)); }
...
};
// Default naive implementation in unspecialized case
template <typename T_Coll, typename T_MapFcn>
auto map(const T_Coll& src, T_MapFcn fcn) {
std::vector<decltype(fcn(internal::_firstElem(src)))> out;
std::transform(std::begin(src), std::end(src), std::back_inserter(out), fcn);
return out;
};
这样您就可以替换包装器或实现,而无需使用特定的API修改代码。
只是一个想法,或许那里已经有了一些东西,但好多了。
答案 0 :(得分:3)
查看Eric Niebler的范围proposal和样本implementation,了解为未来C ++标准提出的类似API。
Chandler Carruth的C ++ Now 2014 talk关于Range算法的另一个尝试是设计一个更具功能性的&#39; C ++的样式算法库。