用C ++覆盖Cast运算符

时间:2012-08-25 13:16:19

标签: c++ string boost syntax casting

作为一名C ++初学者,我想写一些简单的类型转换。有没有办法创建可以type new = (type)old格式使用前缀括号的构建逻辑?

string Text = "Hello";
char* Chars = "Goodbye";
int Integer = 42;

string Message = Text + (string)Integer + (string)Chars + "!";

如果可能,我想坚持使用这种语法。例如,boost int Number = boost::lexical_cast<int>("Hello World")的字符串强制转换具有不具吸引力的长语法。

2 个答案:

答案 0 :(得分:2)

只需使用为不同类型重载的普通函数:

std::string str(int i) {
   return "an integer";
}

std::string str(char* s) {
   return std::string(s);
}

然后使用if if not like cast,但作为普通函数调用:

string Message = Text + str(Integer) + str(Chars) + "!";

答案 1 :(得分:1)

这是C ++中使用NAME<TYPE>(ARGUMENT)语法进行强制转换的最常见的事情,例如在static_cast<int>(char)中。以扩展方式扩展它是有意义的。

但是,如果要转换非基本类型,可以使用带有单个参数的非显式构造函数和转换运算符。

class MyType {
  public:
    MyType(int); // cast from int
    operator int() const; // cast to int
};

如果您正在处理现有类型,则无法进行此操作。

您无法更改C风格演员表的行为。 C ++将决定如何解释这样的演员。

可以但是想出一种缩短语法的中间类型:

template <typename From>
struct Cast {
  From from;
  Cast(From const& from) : from(from) {}
  template <typename To>
  operator To() const {
    return convert(from,To());
  }
};

template <typename From>
Cast<From> cast(From const& from) {
  return Cast<From>(from);
};

std::string convert(int, std::string const&);

这将允许您明确地转换事物,但没有说明具体如何:

int i = 7;
std::string s = cast(i);