不能单独重载由 return 类型区分的函数,但这不是真正的错误

cannot overload functions distinguished by return type alone but it is not a real mistake

我有一些函数的不同变体,由预处理器定义选择

    #if defined(V2)
        bool getAICoord(TTT_Game& game) {
    
            //
            // 4x4 field
            //
    
            return false;
        }
    #elif defined(V3)
        bool getAICoord(TTT_Game& game) {
    
            //
            // renju field
            //
    
            return false;
        }
    #else // V1 
        bool getAICoord(TTT_Game& game) {
            // some code
            return false;
        }
    #endif

它编译得很好,但 IntelliSense 给我错误

cannot overload functions distinguished by return type alone

我知道,它并不完美,但是有什么方法可以从它的清单或类似的东西中排除这个功能吗?

您可以通过仅键入一次函数签名并在函数主体上使用预处理器定义来解决此错误;例如

bool getAICoord(TTT_Game& game) {
#if defined(V2)
    //
    // 4x4 field
    //
    return false;
#elif defined(V3)
    //
    // renju field
    //
    return false;
#else // V1
    // some code
    return false;
#endif
}

众所周知,预处理器宏会混淆 IDE,因为它们是代码的纯文本转换,而不是语言本身的一部分。

if constexpr 不使用宏,而是让您将条件编译作为语言本身的一部分进行,而不是作为预处理器步骤进行:

这有很多优点:

  • 它减少了 IDE 的混淆。
  • 所有代码路径都会得到语法验证,即使被排除在外也是如此。
constexpr int kVersion = SOME_DEFINE;

bool getAICoord(TTT_Game& game) {
  if constexpr(kVersion == 3) {
      //...    
  } else if constexpr(kVersion == 2) {
      //...
  } else {
      //...
  }
}