在 C++ 中覆盖强制转换运算符

Posted

技术标签:

【中文标题】在 C++ 中覆盖强制转换运算符【英文标题】:Overwrite Cast Operator in C++ 【发布时间】:2012-08-25 13:16:18 【问题描述】:

作为一名 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") 的字符串转换有一个没有吸引力的长语法。

【问题讨论】:

(int)Chars(char*)Integer 已经具有与您希望它们的含义完全无关的特定含义。 boost::lexical_cast(..) 有什么问题?我怀疑你能得到比这更简洁的东西,除非你通过 using 语句将函数拉入本地命名空间。即使那样我也看不到价值,你想清楚你的代码在做什么,并且 lexical_cast 被理解、常见和清晰。 我真的建议不要使用其他语法。较新的演员表的复杂性是有原因的,即使您将它们定义为其他符号,也只会使您的代码难以被除您自己以外的任何人阅读。从长远来看,习惯其他人使用的语法是必经之路 在您的示例中,C++11 允许您编写 std::to_string(Integer)。其他演员已经开始工作了。 @Bo Persson。 to_string 工作正常。你说其他人已经工作了。那么如何将string 转换为char*?我想在一行中完成,例如char* Text = ("Hello Number " + to_string(8) + "!") 【参考方案1】:

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

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


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

然后使用 if 不像强制转换,而是作为普通函数调用:

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

【讨论】:

使用 C++11,您已经在标准库中拥有 std::to_string(Integer)【参考方案2】:

在 C++ 中最常见的是使用 NAME<TYPE>(ARGUMENT) 语法进行转换,就像在 static_cast<int>(char) 中一样。以 boost 的方式扩展它是有意义的。

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

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);

【讨论】:

以上是关于在 C++ 中覆盖强制转换运算符的主要内容,如果未能解决你的问题,请参考以下文章

重载强制转换运算符时的 C++ 歧义

如何在 Visual C++ 2015 中的 C++ 强制转换运算符的尖括号内保留空格?

C++ 强制转换运算符重载和多态性

是否可以强制转换 c++ 运算符新输出? [关闭]

c ++:强制转换运算符与分配运算符与转换构造函数优先级

C++基础语法梳理:智能指针和强制类型转换运算符