如何将添加成员函数到Boost.Variant的操作描述成一个长尾?

2026-04-16 16:553阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计725个文字,预计阅读时间需要3分钟。

如何将添加成员函数到Boost.Variant的操作描述成一个长尾?

在我C库中,有一个类型boost::variant,它可以将此类型作为输入。我没有成员函数,而是在这种类型上有全局函数,例如void f(boost::variant var)。我知道这也可以通过模板实现,但感觉直接使用全局函数更简洁。

在我的C库中,我有一个类型boost :: variant< A,B>和许多算法将此类型作为输入.我没有成员函数,而是在这种类型上有全局函数,比如void f(boost :: variant< A,B>& var).我知道这也可以通过模板实现,但这不适合我的设计.

这种编程风格我很好:

boost::variant<A, B> v; f( v );

但是这个库的一些用户不习惯它,并且由于Boost.Variant概念被类型定义隐藏,他们感觉就像调用v.f().

为了实现这一点,我可以想到两种可能性:1)覆盖boost :: variant和2)重新实现boost :: variant并添加我自己的成员函数.我不确定这些想法是否合适.你能帮我个忙吗?还有其他可能吗?

另一种可能性:使用聚合.然后,不要直接将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(维护负担),我不会继承它.尽可能使用聚合.

如何将添加成员函数到Boost.Variant的操作描述成一个长尾?

本文共计725个文字,预计阅读时间需要3分钟。

如何将添加成员函数到Boost.Variant的操作描述成一个长尾?

在我C库中,有一个类型boost::variant,它可以将此类型作为输入。我没有成员函数,而是在这种类型上有全局函数,例如void f(boost::variant var)。我知道这也可以通过模板实现,但感觉直接使用全局函数更简洁。

在我的C库中,我有一个类型boost :: variant< A,B>和许多算法将此类型作为输入.我没有成员函数,而是在这种类型上有全局函数,比如void f(boost :: variant< A,B>& var).我知道这也可以通过模板实现,但这不适合我的设计.

这种编程风格我很好:

boost::variant<A, B> v; f( v );

但是这个库的一些用户不习惯它,并且由于Boost.Variant概念被类型定义隐藏,他们感觉就像调用v.f().

为了实现这一点,我可以想到两种可能性:1)覆盖boost :: variant和2)重新实现boost :: variant并添加我自己的成员函数.我不确定这些想法是否合适.你能帮我个忙吗?还有其他可能吗?

另一种可能性:使用聚合.然后,不要直接将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(维护负担),我不会继承它.尽可能使用聚合.

如何将添加成员函数到Boost.Variant的操作描述成一个长尾?