如何使用Boost来实现C ++ 14风格的自动返回types?

假设我有一个将两个值相加的函数。 如果我对types一无所知,那么我基本上必须写两次函数。 一次在实际返回值中,再次作为返回types说明符:

template <typename A, typename B> auto Add(const A& a, const B& b) ->std::decay<decltype(a + b)>::type { return a + b; } 

虽然这是有效的,但这是不可取的,因为它很难阅读和维护。

在C ++ 14中,这不会是一个问题,因为我们可以放弃返回types说明符(虽然我不确定它会做衰减)。 现在,我坚持使用C ++ 11。

我的经验是,无论什么时候我正在寻找一个C ++的function,还没有进入标准,但是显然需要这个function, Boost库通常有一个解决scheme。 我已经通过文档search,但我还没有发现任何可能帮助我。 BOOST_AUTO_RETURNBOOST_TYPEOF_TPL特性似乎更多的是为C ++ 03用户提供C ++ 11function。

基本上我所追求的是执行以下function的东西:

 template <typename A, typename B> auto Add(const A& a, const B& b) { return a + b; // Deduce return type from this, like C++14 would } 

在Boost库中有一些我不知道的function(或者C ++ 11中的一个妙用),可能会让我在每次自动返回types之后放弃显式-> decltype(...) 。 这将如何实施?

2 Solutions collect form web for “如何使用Boost来实现C ++ 14风格的自动返回types?”

C ++ 11中唯一可能的推导函数返回types是lambda的返回types。 不过,C ++ 11限制了lambdaexpression式的使用。 这工作:

 auto add = [](int a, int b) { return a + b; }; 

这是有效的,并将add定义为定义返回intoperator()成员函数的lambda。 由于lambda没有捕获任何东西,你甚至可以写

 auto add = +[](int a, int b) { return a + b; }; 

使add一个正则指针函数:它得到typesint(*)(int, int)

但是,C ++ 11不允许将参数types指定为auto ,也不允许将add定义为模板variables,所以不能使用它来一般性地推断返回types。 尝试将其包装在模板类中失败:

 template <typename A, typename B> struct S { static auto add = [](A a, B b) { return a + b; }; }; // invalid 

在这里初始化add in-class是无效的,除非成员是在类中初始化的,否则你不能使用auto 。 此外,即使它起作用,也不允许扣除AB ,这似乎更像你以后的事情。

鉴于这些限制,我没有看到任何其他的select,只能重复expression。 不过,你可以在一个微不足道的macros中隐藏重复。

 #define AUTO_RETURN(func, ...) auto func -> decltype(__VA_ARGS__) { return __VA_ARGS__; } template <typename A, typename B> AUTO_RETURN(add(A a, B b), a + b) 

或者Marc Glisse指出的变体,

 #define RETURNS(...) noexcept(noexcept(__VA_ARGS__)) -> decltype(__VA_ARGS__) { return __VA_ARGS__; } template <typename A, typename B> auto add(A a, B b) RETURNS(a + b) 

看起来有点干净

在Boost中可能有这样的东西,我不知道。 无论如何,考虑到琐碎的事情,Boost在这里似乎过火了。

有一个库Pythy试图模仿这个语法。 但是,它只会在叮当声中工作。 由于这里和这里的这些错误,它不能在gcc上工作。 他们可能是固定的gcc 4.9,但如果你使用gcc 4.9,你可以使用自动返回types,反正。

  • 在GCC的std :: put_time实现状态?
  • Gnu C ++何时会支持C ++ 11而不明确要求?
  • 什么是std :: move(),什么时候应该使用?
  • 为什么标准中不允许初始化模板参数列表中的常量相关types?
  • C ++终止调用没有一个活动的exception
  • 为什么我不能在C ++ 11中创build一个lambdas向量(相同types)?
  • push_back vs emplace_back
  • 初始化std :: atomic_bool?
  • 将成员函数从基类移动到派生类会导致程序无法正常运行
  • C ++ 11 std :: set lambda比较函数
  • 为什么在C ++ 11中改变了std :: vector :: resize签名?