首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成操作符过载函数的有效机制

生成操作符过载函数的有效机制
EN

Code Review用户
提问于 2014-10-06 01:21:11
回答 1查看 155关注 0票数 4

我正在尝试整理一个C++框架(PyCXX)。

一个特定的文件包含大约400行操作符重载函数,我设法将其简化为:

代码语言:javascript
复制
#define OP( op, l, r, cmpL, cmpR ) \
    bool operator op( l, r ) { return cmpL op cmpR; }

#define OPS( l, r, cmpL, cmpR ) \
    OP( !=, l, r, cmpL, cmpR ) \
    OP( ==, l, r, cmpL, cmpR ) \
    OP( > , l, r, cmpL, cmpR ) \
    OP( >=, l, r, cmpL, cmpR ) \
    OP( < , l, r, cmpL, cmpR ) \
    OP( <=, l, r, cmpL, cmpR )

    OPS( const Long &a, const Long &b,   a.as_long() , b.as_long() )
    OPS( const Long &a,       int   b,   a.as_long() , b           )
    OPS( const Long &a,       long  b,   a.as_long() , b           )
    OPS( int         a, const Long &b,   a           , b.as_long() )
    OPS( long        a, const Long &b,   a           , b.as_long() )

#ifdef HAVE_LONG_LONG
    OPS( const Long &a, PY_LONG_LONG b,   a.as_long_long() , b                )
    OPS( PY_LONG_LONG a, const Long &b,   a                , b.as_long_long() )
#endif

    //------------------------------------------------------------
    // compare operators
    OPS( const Float &a, const Float &b,   a.as_double() , b.as_double() )
    OPS( const Float &a, double       b,   a.as_double() , b             )
    OPS( double a,       const Float &b,   a             , b.as_double() )

}    // end of namespace Py

不过,我不知道可否进一步整理一下。

看起来,我可以节省每次传递所有参数的费用,方法是:

代码语言:javascript
复制
#define OPS( ... ) \
    OP( !=, ##__VA_ARGS__ ) \
    OP( ==, ##__VA_ARGS__ ) \
    OP( > , ##__VA_ARGS__ ) \
    OP( >=, ##__VA_ARGS__ ) \
    OP( < , ##__VA_ARGS__ ) \
    OP( <=, ##__VA_ARGS__ )

虽然我有预感,但这可能会降低代码的透明度。

另一个可能的想法是存储对:

代码语言:javascript
复制
#define FD(op, x) (       Float &x , op, x.as_double()    )
#define L1(op, x) ( const Long &x  , op, x.as_long()      )
#define L2(op, x) ( const Long &x  , op, x.as_long_long() )
:

但我正冒着混淆的危险,因为我太努力了。我认为人们普遍认为,在其他条件相同的情况下,可读性胜于简洁。

我还能考虑哪些其他可行的设计模式?

EN

回答 1

Code Review用户

发布于 2014-10-06 10:43:23

这是我想出的最好的办法:

代码语言:javascript
复制
#define OP( op, l, r, cmpL, cmpR ) \
    bool operator op( l, r ) { return cmpL op cmpR; }

#define OPS( ... ) \
    OP( !=, ##__VA_ARGS__ ) \
    OP( ==, ##__VA_ARGS__ ) \
    OP( > , ##__VA_ARGS__ ) \
    OP( >=, ##__VA_ARGS__ ) \
    OP( < , ##__VA_ARGS__ ) \
    OP( <=, ##__VA_ARGS__ )

#define BI_( a, b, convA, convB ) \
    OPS(a, b, convA, convB ) \
    OPS(b, a, convB, convA )

    OPS( const Long  &a, const Long  &b  ,  a.as_long()      , b.as_long()    )
    BI_( const Long  &a, int          b  ,  a.as_long()      , b              )
    BI_( const Long  &a, long         b  ,  a.as_long()      , b              )

#ifdef HAVE_LONG_LONG
    BI_( const Long  &a, PY_LONG_LONG b  ,  a.as_long_long() , b              )
#endif

    OPS( const Float &a, const Float &b  ,  a.as_double()    , b.as_double()  )
    BI_( const Float &a, double       b  ,  a.as_double()    , b              )

#undef OP, OPS, BI_

我在这里详细介绍了这个思想过程:http://mathpad.wikidot.com/pycxx-operators

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/64829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档