如何使用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_RETURN
和BOOST_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(...)
。 这将如何实施?
C ++ 11中唯一可能的推导函数返回types是lambda的返回types。 不过,C ++ 11限制了lambdaexpression式的使用。 这工作:
auto add = [](int a, int b) { return a + b; };
这是有效的,并将add
定义为定义返回int
的operator()
成员函数的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
。 此外,即使它起作用,也不允许扣除A
或B
,这似乎更像你以后的事情。
鉴于这些限制,我没有看到任何其他的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,反正。