如何使用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,反正。

  • 为什么仍然需要在使用语句的RHS中用typename来消歧一个依赖types?
  • 为什么有些人使用交换分配移动?
  • 如何从迭代中删除地图?
  • 使用GCC 4.7初始化初始化程序列表中的unique_ptrs容器失败
  • 什么是C ++ 11中的lambdaexpression式?
  • C ++ 11标准是否要求通过一个常量unordered_container访问元素的两次迭代以相同的顺序访问元素?
  • C ++ 11引入了标准化的内存模型。 这是什么意思? 那么如何影响C ++编程呢?
  • lambda的返回types可以通过返回值推导出来,所以为什么不能使用函数呢?
  • 为什么在C ++ 11中改变了std :: vector :: resize签名?
  • 为什么GCC -O3在filter迭代器上通过std :: deque产生无限的std :: distance?
  • 是否使用lambda函数/expression式支持constexpr?