使用函数模板参数作为类模板参数?
Use function template argument as class template argument?
我试图通过实现类似于 C# 的 Linq 的东西来熟悉 C++ 中的模板。最后,查询数据应如下所示
SomeIteratorType begin = /* ... */;
SomeIteratorType end = /* ... */;
typedef iterator_traits<SomeIteratorType>::value_type Type;
linq<int> query = linq<Type>(begin, end)
.where([](Type value) -> bool { return /* ... */; })
.select([](Type value) -> int { return value.some_property; });
for (int value : query)
cout << value << endl;
我从
template<typename Type>
class linq : public std::iterator<std::input_iterator_tag, Type> {
public:
typedef bool (WherePredicate)(Type value);
// ...
// Copy-constructor, operator=, operator++, ...
// ...
// ...
// Linq functions, e.g.
linq& where (WherePredicate& predicate) const; // returns some specialization of the linq-class (should probably not name this "where")
// ...
};
但是如何从示例中声明构造函数linq(begin, end)
呢?如果begin
和end
是类型IteratorType
我需要生成的linq
对象是类型linq<std::iterator_traits<IteratorType>::value_type>
。甚至有可能从函数模板参数中计算出类模板参数吗?如果不是,当像linq<Type>(begin, end)
一样使用时,是否至少可以确保IteratorType begin
和IteratorType end
足够std::iterator_traits<IteratorType>::value_type == Type
?
因此,C# 通过接口使用堆分配的对象和间接寻址,就好像它是空闲的一样。
如果你想效仿它,你必须做同样的事情。 如果你还需要值语义,你必须编写包含智能指针并表现得像值的包装器。
另一种方法是不键入 erase;相反,linq 对象是每个修饰符链的唯一类型。 这里linq
是一个函数而不是一个 tyoe,您将返回值存储在auto
变量中。
这两种方法可以一起工作,如lambda(无类型可调用对象(和std函数(值类型,可以在构造时堆分配和类型擦除,以忘记可调用对象以外的所有调用接口(。
为了更进一步,请了解类型擦除(包括如何编写 std 函数(、C++中的常规类型,并可能查看 Rangesv3 一个支持类似 linq 的流表达式的库。
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 具有常量引用参数的函数模板专用化
- 使用可变参数函数作为模板参数
- std::span<const T> 作为函数模板中的参数
- 如何在C++中伪造虚拟可变参数函数模板?
- C++ std::functional 中的可变参数函数模板
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 三个参数函数模板令人困惑的示例
- 父可变参数函数模板专门用于子级
- C++如何将可变参数函数模板的参数包 -> 包装到 lambda 中
- 将函数传递给可变参数函数模板
- 为什么可变参数函数模板中的这个 constexpr 不是常数?
- 将多个初始值设定项列表传递到可变参数函数模板时遇到问题
- 依赖类型不明确的 c++11 可变参数函数模板重载是否不明确
- 操作可变参数函数模板的函数参数
- C++11 中的非类型可变参数函数模板
- 将可变参数函数模板的每个参数传递给返回void的函数
- 包扩展不在最后一个参数中的可变参数函数模板
- 将可变参数函数模板参数存储到联合向量中的最有效方法
- Clang 和 GCC 在解决可变参数函数模板重载时的行为不同