我正在开发一个遗留库,它需要向后兼容C++03,但也可以向前兼容,以利用移动语义和显式转换等C++11特性。
那么,可以在C++03中模拟显式铸造吗?我显然知道明确的bool (或“安全”bool)成语,但这只是为了转换为布尔类型。在C++03中可以模拟一般的显式cast运算符吗?
我环顾四周,在一本名为"不完美的C++:现实生活规划的实用解决方案“的书中找到了关于这个问题的讨论。
在这本书中,他们讨论了一些关于在C++03中模拟显式强制转换的想法(这本书是在C++11之前写的)。最后,他们建议创建一个explicit_cast<T>模板。但是,我不喜欢这个解决方案,因为我希望用户能够简单地使用static_cast<T>,它在C++11中工作得很好。
因此,另一种解决方案是强制编译器进行两次转换,这将不允许隐式转换。这方面的一个例子是:
class int_cast
{
public:
int_cast(const int& v) : m_value(v)
{ }
operator int() const
{
return m_value;
}
private:
int m_value;
};
struct Foo
{
Foo()
{
x = 10;
}
operator int_cast() const
{
return int_cast(x);
}
int x;
};在这里,Foo应该显式地转换为int,但不能隐式转换。(这段代码几乎是从不完美的C++中逐字解除的,除非在他们的示例中,它们正在将自定义的Time对象转换为std::tm。
然而,这实际上是行不通的,至少不用GCC 4.7.2:
Foo f;
int x = static_cast<int>(f);这导致:
test3.cpp: In function ‘int main()’:
test3.cpp:44:28: error: invalid static_cast from type ‘Foo’ to type ‘int’所以我想“不完美的C++”在这里是错的。即使使用显式强制转换,编译器也无法将Foo转换为int。(也许这适用于较老的编译器?)那么,在C++03 (不使用自定义的强制转换操作符)中是否有类似的情况呢?
发布于 2014-03-02 17:05:38
“不完美的C++”是正确的,因为它使用了一个自定义的“关键字”--实际上是一个函数名,伪装成一个关键字(不像例如:Tribool的indeterminate)。如果您尝试static_cast,您就会崩溃,因为语言只能接受包含最多一种用户定义类型的转换链,而您有两个转换--从"Foo“到"int_cast”,以及从那里到int。
如果你想要特别的能够static_cast,那么你很可能不得不用宏黑一些东西来取代正常的static_cast.并接受生活在行为不明的土地上。我的首选是实际使用反方向工作:只需使用explicit_cast并使用宏将其重新定义为在C++11模式下的static_cast调用。我在我的C++后端工具包中使用显式强制转换,因此在我编写的所有C++代码中都使用了显式强制转换,到目前为止我还没有发现任何重要的问题。
https://stackoverflow.com/questions/22130383
复制相似问题