另一种可能性:使用聚合。然后,您不会直接将 boost.variant 公开给库的用户,从而为您提供更多未来改进的自由,并且可以大大简化一些调试任务。
一般建议:聚合不如继承紧密耦合,因此默认情况下更好,除非您知道一个用例,您明确希望将对象实例传递给仅采用变体的现有函数。甚至在设计基类时也应该考虑到继承。
为您的问题进行聚合的示例:据我了解,免费功能已经存在,并采用了变体。只需使用变体的唯一数据成员定义一个类,并提供公共成员函数,这些函数除了调用具有成员变体的已经存在的自由函数之外什么都不做,例如
class variant_wrapper {
boost::variant<A,B> m_variant;
public:
variant_wrapper(...) : m_variant(...) {} // whatever c_tor you need.
void f() { f(m_variant); }
};
使用这种方法,您可以抽象出您正在使用 boost.variant 来实现您的实现(您已经通过 typedef 为库的用户做了),让您可以自由地稍后更改它(用于优化或功能扩展或其他),您可以决定使值不可变,使用更简单的方法来调试对算法的访问等等。
聚合的缺点是您不能只将包装器传递给 static_visitor,但由于您的用户不知道存在变体,并且您知道只需传递成员变量,因此我认为这里没有什么大问题。
最后咆哮:C++ 不是 Java。您需要修复图书馆的用户......
您想要的是 C# 扩展方法;这样的东西在 C++ 中不存在。但是,我不会重新实现/实现复制 boost.variant(维护负担),也不会继承它。尽可能使用聚合。