代码之家  ›  专栏  ›  技术社区  ›  Johan Kotlinski

如何从我的专用std::max返回临时文件?

  •  0
  • Johan Kotlinski  · 技术社区  · 14 年前

    你好! 我想专攻 std::max

    系统特定的原型 max 我想用这个:

    fract builtin_max(fract a, fract b);
    

    我的想法是 标准::最大值 看起来像这样:

    template <> inline
    const fract& std::max<fract>(const fract& a, const fract& b) {
        return builtin_max(a, b);
    }
    

    但是,编译器抱怨返回对本地临时文件的引用是可以理解的。我有办法解决这个问题吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Kirill V. Lyadvinsky    14 年前

    可以按值返回结果。那么 RVO

    builtin_max 声明

    fract builtin_max(const fract& a, const fract& b);
    

    max 看起来像:

    template <> 
    fract std::max<fract>(const fract& a, const fract& b) {
        return builtin_max(a, b);
    }
    
        2
  •  1
  •   David Rodríguez - dribeas    14 年前

    builtin_max 接下来的方法是更改签名,使其接受两个常量引用并返回一个常量引用(除非类型足够小,传递值是有意义的),并为它的非常量版本重载。然后你可以用简单的方法调整签名:只需转发呼叫。

    fract const & builtin_max( fract const & lhs, fract const & rhs );
    fract & builtin_max( fract & lhs, fract & rhs );
    
    template <>
    fract const & std::max( fract const & lhs, fract const & rhs ) {
       return builtin_max( lhs, rhs );
    }
    template <>
    fract & std::max( fract & lhs, fract & rhs ) {
       return builtin_max( lhs, rhs );
    }
    

    另一个简单的事情,你可以做的是不超载 std::max 而是自己生产 max 最大值 fract 价值观会发现你的 最大值 在他们尝试使用 标准::最大值 默认模板。同样,这对于完全限定的 标准::最大值

    namespace x {
       class fract;
       fract max( fract lhs, fract rhs ) { return builtin_max( lhs, rhs ); }
    }
    // force a link time error if fully qualified std::max is used (undefined)
    // instead of silently getting std::max to use < (if it is defined)
    // if there is no operator<( fract const &, fract const & ), leave this out
    // to get an earlier compile time error
    template <> fract const & std::max( fract const &, fract const & );
    template <> fract & std::max( fract &, fract & );
    
    int main() {
       using namespace std;
       fract a,b;
       max( a, b );          // x::max
       // std::max( a, b )   // ouch, link time error
    }
    
        3
  •  0
  •   Johan Kotlinski    14 年前

    我的解决办法就是这样:

    fract std::max(fract a, fract b) {
        return builtin_max(a, b);
    }
    

    超级简单,而且工作方式和我想要的一样:)