其他库中类型之间的 C++ 转换运算符

2023-12-08

为了方便起见,我希望能够在其他库中定义的两种类型之间进行转换。 (具体来说,QString来自 Qt 库和UnicodeString来自 ICU 库。)现在,我已经在项目命名空间中创建了实用函数:

namespace MyProject {
    const icu_44::UnicodeString ToUnicodeString(const QString& value);
    const QString ToQString(const icu_44::UnicodeString& value);
}

这一切都很好,但我想知道是否有更优雅的方式。理想情况下,我希望能够使用强制转换运算符在它们之间进行转换。然而,我确实想保留转换的显式性质。隐式转换不应该是可能的。

有没有更优雅的方法来实现这一点而不修改库的源代码?也许是一些运算符重载语法?


你总是可以准确地做你正在做的事情,但让它看起来更像选角。这样做甚至可能有一些合理的论据,例如能够覆盖更多类型并保留相同的语法。

考虑:

template < typename DestType, typename SourceType >
DestType string_cast(SourceType const& source)
{
  return string_cast_impl<DestType,SourceType>::apply(source);
}

template < typename DestType, typename SourceType >
struct string_cast_impl;

template < >
struct string_cast_impl<QString,icu_44::UnicodeString>
{
  QString apply(icu_44::UnicodeString const& val) { return MyProject::ToQString(value); }
};

// etc...

您可能会考虑不使用 impl 结构(因为您永远不需要部分专业化),或者您可能会考虑增强它以便可以使用enable_if。无论如何,您将拥有一个用于字符串类型转换的通用接口,这样您就不需要记住要调用什么函数......只需调用 string_cast(source) 即可。

编辑:想一想,我正在做你在我的一个项目中所做的事情,从 std::string 转换为 std::wstring 或从 std::wstring 转换。我想我会用这个替代方案来代替它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

其他库中类型之间的 C++ 转换运算符 的相关文章

随机推荐