Boost logo

Boost :

Subject: Re: [boost] C++11 Metaprogramming
From: Dave Abrahams (dave_at_[hidden])
Date: 2012-04-03 13:44:41


on Tue Apr 03 2012, Howard Hinnant <howard.hinnant-AT-gmail.com> wrote:

>> That's lovely, but... exactly how does noexcept play into the
>> metaprogramming picture?
>
> For example, I used it to create an is_nothrow_swappable<A> trait (http://llvm.org/svn/llvm-project/libcxx/trunk/include/type_traits) so that I could write:
>
> struct B
> {
> A a;
> };
>
> void swap(B& x, B& y) noexcept(__is_nothrow_swappable<A>::value)
> {
> swap(x.a, y.a);
> }
>
> instead of:
>
> using std::swap;
> void swap(B& x, B& y) noexcept(
> noexcept(
> swap(declval<A&>(),
> declval<A&>())))
> {
> swap(x.a, y.a);
> }
>
> The latter gets very tedious when B has several members and/or bases.

But isn't this a better way to relieve the tedium?

  #define RETURNS(...) \
  noexcept(noexcept(decltype(__VA_ARGS__)(std::move(__VA_ARGS__)))) \
  -> decltype(__VA_ARGS__) \
  { return (__VA_ARGS__); } \
  typedef int RETURNS_CAT(RETURNS_, __LINE__)

  #define RETURNS_CAT_0(x, y) x ## y
  #define RETURNS_CAT(x, y) RETURNS_CAT_0(x,y)

...

  auto swap(B& x, B& y) RETURNS(swap(x.a,y.a), swap(x.b,y.b), ...);

-- 
Dave Abrahams
BoostPro Computing
http://www.boostpro.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk