使用迭代器的泛型构造函数
Generic constructor using iterators
我有一个时间序列类TimeSeries
,我需要能够从一些日期和值构建它。Date
是一个日期类。我现在的构造函数是:
TimeSeries(std::vector<Date>::const_iterator dates, std::vector<double>::const_iterator values, std::size_t s)
,我用TimeSeries(dates.begin(), fixings.begin(), size)
来称呼它,其中dates
是std::vector<Date>
, fixings
是std::vector<double>
。
但是我想调整构造函数,这样我就可以使用c++标准库的方式来调用迭代器,而不引用底层数据类型:dates
和values
不需要是std::vector
上的迭代器。
遗憾的是我不能算出构造函数的参数。这可能吗?
这是可能的。为什么不以"c++标准库的方式"来实现它呢?
template<class DateIt, class ValueIt>
TimeSeries(DateIt dates, ValueIt values, std::size_t s)
{
/*ToDo - your construction here*/
}
那么你可以使用TimeSeries(dates.begin(), fixings.begin(), size)
来调用它。
我的"灵感"来自std::max_element
的工作方式:http://en.cppreference.com/w/cpp/algorithm/max_element
您可以使用模板来接受任何类似迭代器的对象。要修复接口,在标准库中查找类似的行为通常是一个好主意。
在这种情况下,您想要迭代两个具有相同数量元素的序列,并对每个序列做一些事情(即,将它们插入您的时间序列中)。这听起来很像std::transform的双序列形式:
template< class InputIt1, class InputIt2, class OutputIt,
class BinaryOperation >
OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2,
OutputIt d_first, BinaryOperation binary_op );
你不需要用户能够指定一个二进制操作;构造函数已经知道该做什么。您也不需要输出迭代器,因为它只为第一个序列留下begin,end
对,为第二个序列留下begin
迭代器:
template <typename DateIterator, typename ValueIterator>
TimeSeries(DateIterator first, DateIterator last, ValueIterator first2);
这种形式只要求值序列至少具有与日期序列上指定的范围相同数量的元素。特别是,没有明确给出大小,因此这种形式可以与更通用的输入迭代器概念一起使用,而不是仅限于前向迭代器(参见http://en.cppreference.com/w/cpp/iterator了解迭代器类别)。
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 泛型模板函数始终返回整数值
- 继承泛型成员函数
- 泛型成员函数定义
- C++14:具有泛型std::函数作为类成员的泛型lambda
- 绑定泛型成员函数
- 具有右值引用成员的泛型复制构造函数
- 多态树类中的双指针upcast(再次)、shared_ptr和泛型setChild函数
- 泛型std::函数上的包装器类
- 使用迭代器的泛型构造函数
- 构造函数不允许返回类型(泛型链表)
- 用类和函子作为模板参数实现一个泛型二进制函数
- 创建泛型转换函数
- 泛型成员函数指针作为另一个类中的模板参数
- 概念与复制构造函数冲突的泛型编程
- 如何在专门化版本中调用泛型模板函数
- 如何为带有函子的自定义容器创建泛型插入函数
- 在存在泛型构造函数的情况下,对三元运算符的SFINAE失败
- 泛型std::函数成员