在 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_caststd::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++ 中覆盖强制转换运算符的主要内容,如果未能解决你的问题,请参考以下文章