如果我正在编写一个库并且我有一个需要返回一系列值的函数,我可以执行以下操作:
std::vector<int> get_sequence();
但是,这要求库用户使用 std::vector<> 容器,而不是允许他们使用他们想要使用的任何容器。此外,它可以添加返回数组的额外副本(取决于编译器是否可以优化它),这可能会对性能产生负面影响。
理论上,您可以通过制作一个带有开始和结束迭代器的模板化函数来启用任意容器的使用(并避免不必要的额外复制):
template<class T_iter> void get_sequence(T_iter begin, T_iter end);
然后该函数会将序列值存储在迭代器给定的范围内。但是这样做的问题是它需要您知道序列的大小,以便在序列之间有足够的元素begin
并end
存储序列中的所有值。
我想到了一个界面,例如:
template<T_insertIter> get_sequence(T_insertIter inserter);
这要求 T_insertIter 是一个插入迭代器(例如,使用 创建std::back_inserter(my_vector)
),但这似乎太容易误用,因为编译器会很乐意接受非插入迭代器,但在运行时会表现不正确。
那么设计返回任意长度序列的通用接口是否有最佳实践?