【发布时间】:2013-12-08 20:27:09
【问题描述】:
我正在玩 std::array 并想了解用例以及可以做什么和不可以做什么。
所以,我为自己定义了一堆类似的array-types,现在想定义一个适用于所有这些类型的函数。
#include <array>
#include <algorithm> // accumulate, iota
#include <iostream>
using January = std::array<int,31>;
using February = std::array<int,28>;
using March = std::array<int,31>;
using April = std::array<int,30>; // ...more Months..
int main() {
/* init */
Januar jan; std::iota(begin(jan), end(jan), 1); // 1..31
February feb; std::iota(begin(feb), end(feb), 1);
March mar; std::iota(begin(mar), end(mar), 1);
April apr; std::iota(begin(apr), end(apr), 1);
/* sum them up */
int all = sum(jan) + sum(feb) + sum(mar) + sum(apr); // sum()-calls
}
因此,任务是定义一个函数sum,它可以在所有array 类型上工作。但由于所有这些类型都不同,我只能想到一个函数模板。
template<typename ARRAY>
int sum(const ARRAY& arr) {
return std::accumulate(begin(arr), end(arr), 0);
}
对于那些害怕编写模板的 C++ 程序员,有没有无模板的解决方案?如何编写适用于不同array-types的单个函数?
【问题讨论】:
-
咳咳。是的,我想知道但是:"...并且想了解用例以及可以做什么和不能做什么"
-
“适用于不同的
array-types” 我将其解释为不同的长度,而不是不同的value_types。好吧,您基本上拥有与原始数组相同的选项,因为不同的std::array-specializations 是不相关的。例如,您可以编写一个accumulate函数,它接受两个int*和一个int作为参数(实际上是std::accumulate<int*, int>)。 -
@towi 你必须使用
sum(array)语法,还是sum(array.data(), array.data()+array.size())可以接受? -
@yakk:可以接受。但我明显的尝试也是一个模板,带有两个迭代器参数,即
template<typename IT> int sum(IT begin, IT end);。替代方案?
标签: c++ arrays function templates c++11