【问题标题】:Function parameters: accepting a null value also函数参数:也接受空值
【发布时间】:2026-01-16 13:30:01
【问题描述】:

大家好,我目前正在编写一个更改边框颜色的函数。

void ChangeColor(D3DXVECTOR4 xColorLeft, D3DXVECTOR4 xColorRight, D3DXVECTOR4 xColorTop, D3DXVECTOR4 xColorBot);

现在这一切都很好,但是我想给我的用户一些易用性,例如如果使用 NULL 值调用 ChangeColor,它不会改变任何东西。

例子:

ChangeColor(D3DXVECTOR4(0.0f, 0.0f, 0.0f, 1.0f), NULL, NULL, NULL);

通过这个函数调用,我会改变左边框的颜色,但由于在其他边框上调用了 NULL,我会将它们保留为默认值。当我尝试这个调用时,我收到一些关于包含 ints 的重载方法的错误。

如果不使用ChangeColorLeft 等任何方法,这是否可能?如果是这样,我会怎么做?

提前谢谢你。

【问题讨论】:

  • 你试过默认参数了吗?
  • 默认参数是什么意思?
  • ChangeColorLeft 的优势在于意图明确,否则您必须记住顺序(并且没有顺序是完美/直观的))

标签: c++ methods parameters arguments


【解决方案1】:

它应该适用于您的 NULL 值... 但是我觉得不干净(特殊的默认颜色值更好):

void changeColorLeft(void*) { /* Do nothing */ }
void changeColorRight(void*) { /* Do nothing */ }
void changeColorTop(void*) { /* Do nothing */ }
void changeColorBottom(void*) { /* Do nothing */ }

void changeColorLeft(const D3DXVECTOR4& color) { /* implementation */ }
void changeColorRight(const D3DXVECTOR4& color) { /* implementation */ }
void changeColorTop(const D3DXVECTOR4&) color{ /* implementation */ }
void changeColorBottom(const D3DXVECTOR4& color) { /* implementation */ }

template<typename T1, typename T2, typename T3, typename T4>
void ChangeColor(T1&& xColorLeft, T2&& xColorRight, T3&& xColorTop, T4&& xColorBot)
{
    changeColorLeft(xColorLeft);
    changeColorRight(xColorRight);
    changeColorTop(xColorTop);
    changeColorBottom(xColorBot);
}

【讨论】:

    【解决方案2】:

    令人高兴的是,D3DXVECTOR4 是一组四个浮点数,并且浮点数支持像 NAN 这样的魔法值。那么这个怎么样:

    const D3DXVECTOR4 NoColor(NAN, NAN, NAN, NAN);
    void ChangeColor(
        D3DXVECTOR4 xColorLeft = NoColor,
        D3DXVECTOR4 xColorRight = NoColor,
        D3DXVECTOR4 xColorTop = NoColor,
        D3DXVECTOR4 xColorBot = NoColor);
    

    然后您只需检查每个参数是否为 NAN,如果是,请不要更改那个。

    【讨论】:

    • 这是个好主意。为了澄清,我想我必须将NoColor 设为常量,就像NULLNAN 一样?
    • @user2280704:是的,它应该是 const——我会添加它。
    【解决方案3】:

    NULL 和 D3DXVECTOR4 之间没有转换。您可以使用指向 D3DXVECTOR4 的指针作为参数,它们可以为 NULL。

    【讨论】:

      最近更新 更多