作为一名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")
的字符串强制转换具有不具吸引力的长语法。
答案 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);