2010-07-22 91 views
8

假设你有一个模板类的C++ 0x std :: array成员,并且想通过一个需要几个迭代器的构造函数初始化它:在初始化std :: array

template <typename Tp, size_t N> 
class Test 
{ 
public: 
    template <typename Iterator> 
    Test(Iterator first, Iterator last) 
    { 
     if (std::distance(first,last) > N) 
      throw std::runtime_error("bad range"); 
     std::copy(first, last, _M_storage.begin()); 
    } 

private: 
    std::array<Tp, N> _M_storage; 

}; 

假设您提供的存储空间大小一致,是否可以在构造函数初始化程序中初始化std :: array,避免存储中Tps的默认超级构造函数?在这种情况下是否有可能利用std :: initializer_list <>?

+1

顺便说一下,保留一个以下划线开头,后面跟着大写字母的标识符。另外,它应该是'std :: distance(first,last)'。 – GManNickG 2010-07-22 17:49:26

+0

监督固定。额外的默认构造函数的问题仍然存在... – 2010-07-22 18:07:12

回答

3

std::array是一个聚集,所以你得到像服用迭代器的构造没有特殊的功能。 (这实际上令我感到惊讶,引入了std::initializer_list我认为在制作其他有用的构造函数中没有任何坏处,也许存在一个问题。)

这意味着使用迭代器在数组内复制数据的唯一方法是迭代,并且要做到这一点array必须已经构建好并可以使用。

相关问题