2010-07-26 34 views
0

你好! 我想专门针对平台特定的分数类型std::max如何从我的专业std :: max中返回临时文件?

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

fract builtin_max(fract a, fract b); 

我的专业std::max的想法是这样的:

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

然而,编译器可以理解的抱怨关于返回一个本地临时引用。有什么办法可以解决这个问题吗?

回答

0

我的解决办法是做只是这样的:

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

超级简单,作品就像我想让它:)

3

您可以通过值返回结果。那么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); 
} 
+0

我试过了,但编译器不支持它。 – 2010-07-26 10:33:37

+0

@kotlinski这是否意味着fract没有复制构造函数?或者你的问题是RVO不会发生? – SadSido 2010-07-26 10:38:22

+0

它有一个复制构造函数。我的猜测是RVO不会发生,或者编译器在发出警告时没有对其进行说明。 – 2010-07-26 10:43:25

1

如果你可以修改去改变着签名,这样只有两个常引用,并返回一个固定参考(除非该类型是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功能。所有使用值的max的不合格用途将在他们尝试使用std::max默认模板之前找到您的max函数。话又说回来,这将不完全合格的呼叫工作std::max

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 
}