簡體   English   中英

C ++ Struct隱式轉換

[英]C++ Struct implicit conversion

我需要聲明大量簡單的POD結構,它們的行為相同,但實際上是不同的類型,即不是typedef。

無論如何,我只想讓它們盡可能簡單。 但是在測試時我發現編譯器執行了一些隱式轉換,我想避免這種情況。

鑒於此代碼:

  template<typename T>
  struct Struct {
    T data;

    operator T() const { return data; }
  };

  void fun(Struct<float> value)
  {
    cout << "Call with Struct :: " << value << endl;
  }

  void fun(int value)
  {
    cout << "Call with INT :: " << value << endl;
  }

int main(int, char**)
{
  fun(3);
  fun(4.1f);
  fun(Struct<float>{5.2});
  fun(Struct<double>{6.3});
  return 0;
}

與GCC匯編。

執行給了我:

Call with INT :: 3       // Ok
Call with INT :: 4       // [1]
Call with Struct :: 5.2  // Ok
Call with INT :: 6       // [2]

如何避免隱式轉換[1]和[2]?

謝謝

根據評論的要求:

operator T()使用explicit關鍵字實際上會阻止隱式類型轉換。

因此,以這種方式聲明結構:

template<typename T>
struct Struct {
    T data;

    explicit operator T() const { return data; }
};

將使編譯器阻止隱式轉換,並要求客戶端代碼專門請求轉換(即在需要T(Struct<T>)地方使用T(Struct<T>)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM