这里很大程度上取决于你从哪里开始(C++03 与 C++11)以及你真正想去哪里(只传递数字,或者传递类似 an 的东西对你有用std::array
)。
如果您有 C++11 并且只想传递数字,那么执行以下操作可能最简单:
#include <vector>
#include <iostream>
#include <initializer_list>
class pixel {
std::vector<double> color;
public:
pixel(std::initializer_list<double> && l) : color(l) {}
~pixel() {
// show the data we received:
for (double const &f : color)
std::cout << f << "\t";
}
};
int main() {
pixel{1.9, 2.8, 3.7, 4.6, 5.5};
}
请注意,anstd::initializer_list
不支持缩小转换,因此如果要将数字存储为float
而不是double
,则需要实际传递float
s:
pixel{1.9f, 2.8f, 3.7f, 4.6f, 5.5f};
然而,与@Chris 的解决方案不同,这并不试图强制传递给定数量的参数——它只是符合存储您传递的任何数字。作为回报,它更容易使用。您不需要指定大小 - 它会根据您传递的项目数量来计算。
如果您喜欢这个总体思路,但坚持使用数组和 C++03(为什么?),您可以执行以下操作:
#include <vector>
#include <iostream>
#include <algorithm>
template<class T, size_t N>
class pixel {
T color[N];
public:
pixel(T(&matrix)[N]) {
std::copy_n(matrix, N, color);
}
};
template <class T, size_t N>
pixel<T, N> make_pixel(T(&matrix)[N]) {
return pixel<T, N>(matrix);
}
int main() {
float a [] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
pixel<float, 5> p = make_pixel(a);
return 0;
}
在这种情况下,我float
作为模板参数传递,但如果你确定它总是float
,你可以只传递大小,并使用float
而不是T
.