编写C++11 LINQ风格选择
Writing C++11 LINQ-style Select
我正试图为我的基类Iterator编写LINQ风格的方法,List和Sequence将从中继承,但这两个容器将有它们自己的方法实现。"Where"方法非常直接。"选择"方法非常棘手;不能有虚拟模板方法。
template <typename T>
class Iterator {
public:
virtual ~Iterator() {};
// This is illegal, but if it weren't, it would be the functionality I want.
template <typename R>
virtual shared_ptr<IIterator<R>> Select(const function<R(T)>& func) = 0;
virtual shared_ptr<IIterator<T>> Where(const function<bool(T)>& func) = 0;
};
"选择"将允许您将"火腿三明治"类型的迭代程序转换为"生菜"类型的循环程序。
火腿三明治->选择<'生菜'>([](shared_ptr<'HamSandwich'>hs){return hs->Lettuce;});
忽略单引号。
由于我们不能有虚拟模板函数,所以我当然不能使函数成为虚拟的。在这种情况下,我们有一个普通的旧函数,与虚拟函数相比,我们永远不应该通过在List和Sequence中编写实现来"隐藏"它的实现;这将被认为是一个设计缺陷。
template <typename T>
class Iterator {
public:
virtual ~Iterator() {};
template <typename R>
shared_ptr<Iterator<R>> Select(const function<R(T)>& func);
virtual shared_ptr<Iterator<T>> Where(const function<bool(T)>& func) = 0;
};
template <typename T>
template <typename R>
shared_ptr<Iterator<R>> Iterator<T>::Select(const function<R(T)>& func) {
//Implementation - What would it be?
}
现在我们必须在基类中有实现,这个实现需要对List和Sequence有一定的特定性。根据我所看到的,您将开始创建受保护的"实现函数",以在"Select"中执行某些可以被List或Sequence覆盖的操作。
我不是在这里寻找确切的答案,我是在寻找一些能帮助我达到我可能/应该达到的目标的东西。有人发现我一开始可能做错了什么吗?
选项1
我看到的在C++中实现LINQ的想法根本不依赖于虚拟方法。相反,每个结果都被包装在一个模板类中返回,大致如下:
template <class T>
class RangeWrapper
{
public:
template <class U>
Select(U u) -> decltype(...) {
return RangeWrapper<SelectRange, U>(_myRange, u);
}
private:
T& _myRange;
};
如果你链接其中的一些,返回类型可能会变得相当大,但这是在编译时完成所有任务所要付出的代价。
选项2
您可以实现类型擦除以始终返回类型为Iterator<T>
的迭代器。使用网络上的类型擦除迭代器库应该很容易实现这一点(有很多,你可以看看boost.TypeErasure,它已被接受但尚未发布)。或者,如果您可以使用范围,您可以在boost中使用any_range(它们比迭代器更自然地映射到LINQ)。
选项3
如果您不将此作为培训练习,那么已经实施了几个解决方案。使用谷歌。值得注意的是,微软自己正在开发一个C++Linq来实现它上面的反应式扩展
- 如何使用默认参数等选择模板专业化
- Qt VTK交互风格的信号到小部件
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 选择要调用的构造函数
- C++选择排序算法中的逻辑错误
- QTreeView幻灯片多选后无法使用单击选择
- 我可以使用条件运算符初始化C风格的字符串文字吗
- Visual Studio 2019:插入多个C++风格的单行注释
- 无法获取菜单选择以运行函数.C++
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 在C++中,如何通过几种类型从元组中选择多个元素
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 对可变参数使用声明.如何选择正确的功能
- 选择选举获胜者的程序
- 如何选择在 csv 文件中输出的位置
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 编写C++11 LINQ风格选择
- Metro 风格混合应用 - C# + WebViews vs. JavaScript + WinRT C++ - 最佳选择是什么?
- c++规范是否说明如何在static_cast/const_cast链中选择用于C风格强制转换的类型?