4

同じように動作するが、実際には型が異なる (つまり、typedef ではない) 単純な POD 構造を多数宣言する必要があります。

とにかく、できるだけシンプルに保ちたいだけです。しかし、テスト中に、コンパイラがいくつかの暗黙的な変換を実行することがわかったので、これを避けたいと思います。

このコードを考えると:

  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] の暗黙的な変換を回避するにはどうすればよいですか?

ありがとう

4

1 に答える 1

5

コメントでリクエストされたとおり:

明示的なキーワード foroperator T()を使用すると、実際には暗黙的な型変換が防止されます。

したがって、構造体を次のように宣言します。

template<typename T>
struct Struct {
    T data;

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

コンパイラに暗黙の変換を防止させ、クライアント コードが特に変換を要求することを要求します (つまりT(Struct<T>)、 T が必要な場所ならどこでも使用します)。

于 2013-05-23T13:19:51.037 に答える