繁体   English   中英

将C ++ 14返回类型推导回C ++ 11

[英]Backport C++14 return type deduction to C++11

如何使此代码与c ++ 11兼容?

template <class ...Args>
auto operator()(Args&&... args) const
{
    return _delegate(std::forward<Args>(args)...);
}

该代码是模板化结构的一部分。 _delegate是成员,定义如下。

/// The implementation of the slot, as a delegate.  
typedef fastdelegate::FastDelegate<Signature> impl_delegate;    
impl_delegate _delegate;

完整的文件可以在这里找到。 它是slot.hpp。 https://github.com/miguelmartin75/Wink-Signals/tree/master/wink

您可以简单地添加尾随返回类型

template <class ...Args>
auto operator()(Args&&... args) const
    -> decltype(_delegate(std::forward<Args>(args)...))
{
    return _delegate(std::forward<Args>(args)...);
}

现场魔盒示例

如果您的编译器在结尾返回类型中抱怨_delegate ,请尝试使用std::declval</* type of '_delegate' */>()代替。


请注意,以上代码的行为可能与C ++ 14的行为不同。 考虑以下成员函数对其进行重载的情况:

auto operator()(...) const { }

在C ++ 14中,自动返回类型推导不兼容SFINAE,因此如果_delegate(std::forward<Args>(args)...) ,则该问题中的原始函数可能会导致硬编译错误-形成而不是SFINAE-离开。

在C ++ 11中, _delegate(std::forward<Args>(args)...)是签名的一部分-如果签名_delegate(std::forward<Args>(args)...) ,其他重载将有机会被选中。

这是wandbox上的实时示例 取消注释第15行以查看更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM