2011-03-22 54 views
5

可以声明,并在同一行初始化规则排列,就像这样:实现数组初始化

int PowersOfTwo[] = {1, 2, 4, 8, 16, 32, 64, 128}; 

有没有办法复制的自定义类这种行为?因此,举例来说:

MyClass<int> PowersOfTwo = {1, 2, 4, 8, 16, 32, 64, 128}; 

你可以有一个拷贝构造函数需要一个数组作为它的参数,但你仍然必须声明上一行的数组。

int InitializationArray[] = {1, 2, 4, 8, 16, 32, 64, 128}; 
MyClass<int> PowersOfTwo = InitializationArray; 

回答

6

您可以实现以这样的方式,你可以写你的类:

MyClass<int> array; 
array = 1,2,3,4,5,6,7,8,9,10;//dont worry - all ints goes to the array!!! 

这是我实现:

template <class T> 
class MyClass 
{ 
    std::vector<T> items; 
public: 

    MyClass & operator=(const T &item) 
    { 
     items.clear(); 
     items.push_back(item); 
     return *this; 
    } 
    MyClass & operator,(const T &item) 
    { 
     items.push_back(item); 
     return *this; 
    } 
    size_t Size() const { return items.size(); } 
    T & operator[](size_t i) { return items[i]; } 
    const T & operator[](size_t i) const { return items[i]; } 

}; 

int main() { 

     MyClass<int> array; 
     array = 1,2,3,4,5,6,7,8,9,10; 
     for (size_t i = 0 ; i < array.Size() ; i++) 
      std::cout << array[i] << std::endl; 
     return 0; 
} 

输出:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

见在线演示:http://www.ideone.com/CBPmj

两个类似的解决方案,您可以在这里看到我昨天发布:

Template array initialization with a list of values


编辑:

类似的技巧,你可以做填充现有的STL容器。例如,你可以这样写:

std::vector<int> v; 
v+=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; //push_back is called for each int! 

所有你需要重载(),操作为:

template<typename T> 
std::vector<T>& operator+=(std::vector<T> & v, const T & item) 
{ 
    v.push_back(item); return v; 
} 
template<typename T> 
std::vector<T>& operator,(std::vector<T> & v, const T & item) 
{ 
    v.push_back(item); return v; 
} 

工作演示:http://ideone.com/0cIUD


再次编辑:

我是having fun with C++ operator。现在这个:

std::vector<int> v; 
v << 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; //inserts all to the vector! 

我觉得这看起来好多了!

+0

我想看看你试试看。我认为你可能还需要一件事情,因为逗号分隔列表int不知道它被分配的类型,赋值操作符具有最低优先级,所以它不会发现,直到太晚(我认为)。 – 2011-03-22 17:56:58

+0

@Martin:我发布了工作代码链接。请看看! – Nawaz 2011-03-22 17:59:23

+1

@Martin:'operator,()'具有所有二元运算符的最低优先级,首先对operator =()进行评估,然后对所有运算符()进行评估。 – Xeo 2011-03-22 18:00:48

4

这是可以做到只有当你的编译器提供支持initializer lists,一个C++ 0x中的功能。

否则,必须使用其他一些语法,如在boost.assign库中。

+2

在Boost.Assign页面开始的时候需要引用这个引号,并且立即显示一个很好的例子:'运算符似乎很少有实际用途,()。' – Xeo 2011-03-22 17:56:53