假设我想实现一个迭代某个范围的类,并将这些值以随机索引存储在数组中。所以我想要一些我能写的东西:
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_[];
};
我忽略了我最终需要的所有其他东西(移动构造函数,开始/结束等)。我只想弄清楚类之前的模板语句应该是什么样的。
答案 0 :(得分:1)
这些方面的东西(未经测试):
template <typename Elem>
class RandomArray {
public:
template <typename InputIter>
RandomArray(InputIter first, InputIter last)
: storage(first, last) {}
template <typename Container>
explicit RandomArray(const Container& c)
: storage(std::cbegin(c), std::cend(c)) {}
// For C-style array
template <typename Elem2, size_t N>
explicit RandomArray(Elem2 (&arr)[N])
: storage(std::cbegin(arr), std::cend(arr)) {}
private:
std:vector<Elem> storage;
};
template <typename InputIter>
auto MakeRandomArray(InputIter first, InputIter last) {
return RandomArray<typename std::iterator_traits<InputIter>::value_type>(
first, last);
}
template <typename Container>
auto MakeRandomArray(const Container& c) {
return RandomArray<typename Container::value_type>(c);
}
// For C-style array
template <typename Elem, size_t N>
auto MakeRandomArray(Elem (&arr)[N]) {
return RandomArray<Elem>(arr);
}