首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++03中模拟显式强制转换

在C++03中模拟显式强制转换
EN

Stack Overflow用户
提问于 2014-03-02 16:43:55
回答 1查看 494关注 0票数 5

我正在开发一个遗留库,它需要向后兼容C++03,但也可以向前兼容,以利用移动语义和显式转换等C++11特性。

那么,可以在C++03中模拟显式铸造吗?我显然知道明确的bool (或“安全”bool)成语,但这只是为了转换为布尔类型。在C++03中可以模拟一般的显式cast运算符吗?

我环顾四周,在一本名为"不完美的C++:现实生活规划的实用解决方案“的书中找到了关于这个问题的讨论。

在这本书中,他们讨论了一些关于在C++03中模拟显式强制转换的想法(这本书是在C++11之前写的)。最后,他们建议创建一个explicit_cast<T>模板。但是,我不喜欢这个解决方案,因为我希望用户能够简单地使用static_cast<T>,它在C++11中工作得很好。

因此,另一种解决方案是强制编译器进行两次转换,这将不允许隐式转换。这方面的一个例子是:

代码语言:javascript
复制
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:

代码语言:javascript
复制
Foo f;
int x = static_cast<int>(f);

这导致:

代码语言:javascript
复制
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 (不使用自定义的强制转换操作符)中是否有类似的情况呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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++代码中都使用了显式强制转换,到目前为止我还没有发现任何重要的问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22130383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档