2017-08-05 26 views
-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_[]; 
}; 

我忽略了我最终需要的所有其他事情(移动构造函数,开始/结束等)。我只想弄清楚在课堂之前的模板声明应该是什么样子。

+0

你真正寻找的是用户指定的模板扣导游,在C++ 17中引入的。 –

+0

你是否期望'arr_'的类型以某种方式神奇地取决于在运行时调用了哪个'RandomArray'构造函数?这不会飞。你可以使RandomArray成为一个类模板参数化的元素类型,然后像MakeRandomArray这样的函数模板将根据它的参数来生成正确的特化。类似于'std :: make_pair'。或者,我可能彻底误解了问题的本质;对演习最终目标的更完整解释可能会有所帮助。 –

+0

@IgorTandetnik:我希望arr_的类型对应于迭代器的值类型。我只是不知道如何表达。 “更好”的构造函数的目的是简单强调我不想传递开始/结束,而是迭代本身。你可以把它看作是主要问题的次要问题。 –

回答

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); 
} 
+0

非常好,似乎工作! –

相关问题