-3
假设我想实现一个遍历某个范围的类,并将这些值存储在随机索引的数组中。所以我想要一些我可以写的东西:接受迭代器作为参数并存储值的类?
string s = "Steve";
auto r1 = RandomArray<char>(s.begin(), s.end());
int a[] = {1,2,3};
auto r2 = RandomArray<int>(begin(a), end(a));
// Later on...
for (const auto ch: r1) {/* do something */}
我该如何定义这样一个类?我无法弄清楚模板应该是什么样子。也就是说,我如何填写下面缺少的内容?
// template stuff
class RandomArray {
public:
RandomArray(/* some iterator argument(s) */) {
// Pretend arr_ has already been sized correctly.
for (const auto it = /* iterate over iterator */) {
arr_[randomIndex()] = it;
}
}
private:
/* Some type */ arr_[];
};
我忽略了我最终需要的所有其他事情(移动构造函数,开始/结束等)。我只想弄清楚在课堂之前的模板声明应该是什么样子。
你真正寻找的是用户指定的模板扣导游,在C++ 17中引入的。 –
你是否期望'arr_'的类型以某种方式神奇地取决于在运行时调用了哪个'RandomArray'构造函数?这不会飞。你可以使RandomArray成为一个类模板参数化的元素类型,然后像MakeRandomArray这样的函数模板将根据它的参数来生成正确的特化。类似于'std :: make_pair'。或者,我可能彻底误解了问题的本质;对演习最终目标的更完整解释可能会有所帮助。 –
@IgorTandetnik:我希望arr_的类型对应于迭代器的值类型。我只是不知道如何表达。 “更好”的构造函数的目的是简单强调我不想传递开始/结束,而是迭代本身。你可以把它看作是主要问题的次要问题。 –