2012-06-24 41 views
0

在我的代码我希望能够做带有可变参数列表初始化表

Table<double> tbl; 
tbl.Create(2, 2, 1.0, 2.0, 3.0, 4.0); 

,通过构造太

Table<double> tbl(2, 2, 1.0, 2.0, 3.0, 4.0); 

从我的经验用省略号(...)导致几个难以追踪的错误,所以我想出了以下初始化我的表格:

void Create(size_t rows, size_t columns, T val0) 
{ 
    ASSERT(rows * columns == 1); 
    Create(rows, columns); 
    _data[0] = val0; 
} 

void Create(size_t rows, size_t columns, T val0, T val1) 
{ 
    ASSERT(rows * columns == 2); 
    Create(rows, columns); 
    _data[0] = val0; 
    _data[1] = val1; 
} 

void Create(size_t rows, size_t columns, T val0, T val1, T val2) 
{ 
    ASSERT(rows * columns == 3); 
    Create(rows, columns); 
    _data[0] = val0; 
    _data[1] = val1; 
    _data[2] = val2; 
} 

我想你会得到想法。但是,如果我想要多达50个元素的功能,这变得相当烦人。更不用说我必须写出所有这些构造函数了。没有其他的方法可以更优雅地处理这个问题吗?

编辑:也许我应该解释为什么我不想在这种情况下使用省略号(...)。让我们看看下面的代码:

Table<double> tbl(2, 2, 1.5, 2.1, 3, 4.5); 

编译器解释第五参数为int类型,这显然是不打算。

回答

3

可变参数模板和初始化列表可能的工作:

struct Table 
{ 
    std::vector<double> data; 

    template <typename ...Args> 
    Table(Args &&... args) 
    : data({std::forward<Args>(args)...}) 
    { } 
}; 
+0

感谢您的答复,但我很想解决这个问题,而无需使用C++ 11层的特性。 – demorge

+0

如果你不想使用'C++ 11'特性,或许你最好的机会是将它传递给一个'double'数组(并且它的大小)并且从它初始化。像'double tmp [] = {2,2,1.5,2.1,3,4.5};表 tbl(tmp,6);'或者写一个宏来为你做。 – Shahbaz

+0

Pre-11 C++对于使用原始C数组非常糟糕。变量函数非常非C++,因为您没有任何类型安全性,并且不可能告诉您正确使用它们。 –