4

我需要声明大量的简单 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] ?

谢谢

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 回答