c++ - 扩展第三方库中的隐式转换

标签 c++ explicit-conversion

背景

如果第三方库有类似的代码

class ThirdPartyClass
{
public:
    int value;

    ThirdPartyClass(int i) : value(i) {}
    ThirdPartyClass(const std::string& s) : value(0) {}

};

bool ThirdPartyFunction(int a, const ThirdPartyClass obj)
{
    return a == obj.value;
}

然后就可以调用了

ThirdPartyFunction(1, 1);
ThirdPartyFunction(1, std::string("Hello, World!"));

问题

是否可以扩展此库(无需修改第 3 方代码)以接受类似以下内容:

ThirdPartyFunction(1, "Hello, World!");   // const char* is not a string, implicit conversion fails

我想避免需要写

ThirdPartyFunction(1, std::string("Hello, World!")); 

以上内容已简化:在我的真实示例中,ThirdPartyFunction 是一个流运算符,ThirdPartyClass 是一个类型包装器,允许与流操纵器交互。

最佳答案

当我开始这个问题时,我怀疑由于其他类似的答案,不可能得到我想要的东西。

当我完成这个问题时,我想出了一个适合我的需求的解决方案,这并不是真正的显式转换,因此您的里程可能会根据您需要实现的目标而有所不同。

我想我不妨将其发布,以防有​​人发现它有用。

解决办法

添加以下定义:

class MyExtension : public ThirdPartyClass
{
public:
    MyExtension(const char*) : ThirdPartyClass(0) {}
};

bool ThirdPartyFunction(int a, MyExtension obj)
{
    return ThirdPartyFunction(a, (ThirdPartyClass)obj);
}

现在可以调用了

ThirdPartyFunction(1, "Hello, World!");

请注意,无需修改第三方代码即可完成上述操作。它确实依赖于函数的重载,因此如果您必须对许多函数执行此操作,则可能不可行。您还可以避免继承,只需在重载函数中从 MyExtension 转换为 ThirdPartyClass 即可。

关于c++ - 扩展第三方库中的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13302264/

相关文章:

c++ - 声明 "intrinsics"只是对编译器的建议是否正确?

c++ - C++中不同数据类型之间的转换

c++ - vector 之间的转换

c++ - pp-tokens 还剩下哪些字符?

c++ - 从基于 QObject 的类继承构造函数

c++ - 如何获取使用 QProcess 调用的程序的返回标准输出?

c++ - 为什么这个帕斯卡三角程序不起作用?

c# - 如果隐式已在 C# 中重载,则重载显式运算符是否有好处?

c++ - 为什么这个显式转换运算符适用于 g++ 而不是 Visual Studio 2013?

c# - 如何从反射执行显式操作转换?