Typecast重载

时间:2016-04-29 18:08:13

标签: c++ casting

我可以重载'+'运算符,但我不确定如何对NewType进行类型转换。我希望它被任命为任何其他变量类型。你能提供一些指示吗?非常感谢!

#include <iostream>

class NewType {
private:
  float val;

public:
  NewType(float v) { val = v; }
  friend NewType operator+(const NewType &c1, const NewType &c2);
  float GetVal() const { return val; }
};

NewType operator+(const NewType &c1, const NewType &c2) { return NewType(c1.val + c2.val); }

int main() {
  NewType a = 13.7;
  // Here is the problem, I would like this to print 13.
  std::cout << (int) a << std::endl;
  return 0;
}

1 个答案:

答案 0 :(得分:2)

  

我希望将其类型化为任何其他变量类型。

对于任何其他变量类型,您需要模板化的用户定义转换:

class NewType {
public
// ...
   template<typename T>
   explicit operator T() const { return T(val); } 
// ...
};

explicit(此处为C ++ 11及以上版本)确保您使用显式强制转换,即:

NewType a = 13.7;
int n = a; // compile error
int n2 = static_cast<int>(a); // now OK

您还可以在用户定义的转换运算符中使用统一初始化:

   template<typename T>
   explicit operator T() const { return T{val}; } 

如果您的演员阵容需要缩小,这将为您提供额外的警告。但正如我在gcc下看到的那样,默认情况下只生成警告(因为我记得这是设计 - 由于许多遗留代码会破坏),在clang下会产生错误:

main.cpp:15:16: error: type 'float' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing]
      return T{val}; 

并且相同的Visual Studio会生成错误。