背景
如果第三方库有类似的代码
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/