用作函数参数时将默认值设置为 C 数组
Set default value to C array when used as function argument
我有以下功能:
void getDefaultMaterial(Uint8 rgb[3]);
问题是我希望 rgb
参数具有默认值。像那样:
void getDefaultMaterial(Uint8 rgb[3]={255, 255, 255});
不幸的是,编译器不喜欢这样?还有别的办法吗?
您可能不需要数组,因为它会衰减为函数参数中的指针。您可以简单地将其声明为指针并将其默认设置为 nullptr
或您喜欢的任何内容,并在函数中确定默认地址。
例如:
void getDefaultMaterial(Uint8 *rgb = nullptr) {
static Uint8 defaultArg[3] = {255, 255, 255};
if (rgb == nullptr) {
rgb = defaultArg;
// Reset them if you need
}
// Your stuff
}
注意参数是指针,不是数组
对于编译器,原型相当于
void getDefaultMaterial(Uint8* rgb);
重载是一种选择:
void getDefaultMaterial(Uint8 rgb[3]);
void getDefaultMaterial()
{
Uint8 rgb[3] = { 255, 255, 255 };
getDefaultMaterial(rgb);
}
虽然,如果 rgb
是一个 "out" 参数,我不明白这一点。
如果不是"out"参数,你可以使用具有默认值的实际数组,但你需要通过常量引用传递它:
void getDefaultMaterial(const Uint8 (&rgb)[3] = {255, 255, 255});
或者,作为 "out" 参数与 "default by overloading":
void getDefaultMaterial(Uint8 (&rgb)[3]);
void getDefaultMaterial()
{
Uint8 rgb[3] = { 255, 255, 255 };
getDefaultMaterial(rgb);
}
你的 "array" 是一个指针,而不是数组。使用实际的数组(只能通过引用传递)可以正常工作。
void fun (const int (&a)[3] = {1,2,3}) {
std::cout << a[1];
}
当然,真正正确的方法是使用std::array
,它没有所有这些限制。
或者使用 std::array 包装器作为参数:
void getDefaultMaterial(std::array<Uint8, 3> rgb = { { 255, 255, 255 } });
这将允许您使用 braced-init-list 作为默认参数值。请注意,只有 C++11 标准才需要 double 大括号。在 C++14 及更高版本的标准中,您可以省略它们:
void getDefaultMaterial(std::array<Uint8, 3> rgb = { 255, 255, 255 });
我有以下功能:
void getDefaultMaterial(Uint8 rgb[3]);
问题是我希望 rgb
参数具有默认值。像那样:
void getDefaultMaterial(Uint8 rgb[3]={255, 255, 255});
不幸的是,编译器不喜欢这样?还有别的办法吗?
您可能不需要数组,因为它会衰减为函数参数中的指针。您可以简单地将其声明为指针并将其默认设置为 nullptr
或您喜欢的任何内容,并在函数中确定默认地址。
例如:
void getDefaultMaterial(Uint8 *rgb = nullptr) {
static Uint8 defaultArg[3] = {255, 255, 255};
if (rgb == nullptr) {
rgb = defaultArg;
// Reset them if you need
}
// Your stuff
}
注意参数是指针,不是数组
对于编译器,原型相当于
void getDefaultMaterial(Uint8* rgb);
重载是一种选择:
void getDefaultMaterial(Uint8 rgb[3]);
void getDefaultMaterial()
{
Uint8 rgb[3] = { 255, 255, 255 };
getDefaultMaterial(rgb);
}
虽然,如果 rgb
是一个 "out" 参数,我不明白这一点。
如果不是"out"参数,你可以使用具有默认值的实际数组,但你需要通过常量引用传递它:
void getDefaultMaterial(const Uint8 (&rgb)[3] = {255, 255, 255});
或者,作为 "out" 参数与 "default by overloading":
void getDefaultMaterial(Uint8 (&rgb)[3]);
void getDefaultMaterial()
{
Uint8 rgb[3] = { 255, 255, 255 };
getDefaultMaterial(rgb);
}
你的 "array" 是一个指针,而不是数组。使用实际的数组(只能通过引用传递)可以正常工作。
void fun (const int (&a)[3] = {1,2,3}) {
std::cout << a[1];
}
当然,真正正确的方法是使用std::array
,它没有所有这些限制。
或者使用 std::array 包装器作为参数:
void getDefaultMaterial(std::array<Uint8, 3> rgb = { { 255, 255, 255 } });
这将允许您使用 braced-init-list 作为默认参数值。请注意,只有 C++11 标准才需要 double 大括号。在 C++14 及更高版本的标准中,您可以省略它们:
void getDefaultMaterial(std::array<Uint8, 3> rgb = { 255, 255, 255 });