奖励积分(可能是赏金):可变大小的阵列怎么样?
int N = 10;
f(double[N]);
Michael Veks..
5
尝试:
fun((int[3]){1,2,3});
fun((int[5]){});
至于"奖励积分":可变大小的数组不是语言的一部分.此语言的扩展名不适用于模板参数:
prog.cc:4:6:注意:候选模板被忽略:替换失败:可变修改类型'int [n]'不能用作模板参数fun(const T&t)
编辑
正如Chris所指出的,上述解决方案建议使用复合文字,它是C++的扩展.有一个解决方案,使用一个简单的帮助器类来避免对C++的这种扩展:
template
struct my_array
{
T data[N];
};
template
void print(const T (&x)[N])
{
for (auto i: x)
std::cout <{9,10,11}.data);
}
这种方法效果很好,但需要向my_array添加模板参数,这些参数不是推导出来的.使用C++ 17,可以自动推断类型和大小:
template
struct my_array
{
constexpr my_array(std::initializer_list x)
{
std::size_t i = 0;
for (auto val : x)
data[i++] = val;
}
T data[N];
};
template
my_array(T...) -> my_array::type, sizeof...(T)>;
int main()
{
print(my_array{9,10,11}.data);
}
对于二维数组,这稍微复杂一些:
template
struct my_array2d
{
constexpr my_array2d(std::initializer_list > x)
{
std::size_t i = 0;
for (const auto & row : x) {
int j=0;
for (const auto & val: row) {
data[i][j++] = val;
}
i++;
}
}
T data[N1][N2];
};
int main()
{
work(my_array2d{{9,1},{10,2},{11,3}}.data);
}
我已经放弃了二维阵列的演绎指南,但我相信它们是可能的.
1> Michael Veks..:
尝试:
fun((int[3]){1,2,3});
fun((int[5]){});
至于"奖励积分":可变大小的数组不是语言的一部分.此语言的扩展名不适用于模板参数:
prog.cc:4:6:注意:候选模板被忽略:替换失败:可变修改类型'int [n]'不能用作模板参数fun(const T&t)
编辑
正如Chris所指出的,上述解决方案建议使用复合文字,它是C++的扩展.有一个解决方案,使用一个简单的帮助器类来避免对C++的这种扩展:
template
struct my_array
{
T data[N];
};
template
void print(const T (&x)[N])
{
for (auto i: x)
std::cout <{9,10,11}.data);
}
这种方法效果很好,但需要向my_array添加模板参数,这些参数不是推导出来的.使用C++ 17,可以自动推断类型和大小:
template
struct my_array
{
constexpr my_array(std::initializer_list x)
{
std::size_t i = 0;
for (auto val : x)
data[i++] = val;
}
T data[N];
};
template
my_array(T...) -> my_array::type, sizeof...(T)>;
int main()
{
print(my_array{9,10,11}.data);
}
对于二维数组,这稍微复杂一些:
template
struct my_array2d
{
constexpr my_array2d(std::initializer_list > x)
{
std::size_t i = 0;
for (const auto & row : x) {
int j=0;
for (const auto & val: row) {
data[i][j++] = val;
}
i++;
}
}
T data[N1][N2];
};
int main()
{
work(my_array2d{{9,1},{10,2},{11,3}}.data);
}
我已经放弃了二维阵列的演绎指南,但我相信它们是可能的.