Re: How to write an is_nothrow_swapable<T>?
on Fri Nov 16 2012, Zhihao Yuan <lichray-AT-googlemail.com> wrote:
Non-throw swapable is quite useful, and it can be more useful if the
concept can be tested. If we already have an object of type T, I
think the following one is enough:
template <typename T>
constexpr bool is_nothrow_swapable(T& t) {
using std::swap;
return noexcept(swap(t, t)) or
(std::is_nothrow_move_constructible<T>::value and
std::is_nothrow_move_assignable<T>::value);
}
That's the wrong test, because the swap operation doesn't use move
construction plus move assignment unless it happens to select std::swap
as the overload. In other words, just return
noexcept(swap(t,t))
However, I want it to be able to work on just a type, to work as an
integral_constant. Is that doable? Comments on how to implement an
is_swapable<T> are also welcome. Thanks.
--8<---------------cut here---------------start------------->8---
#include <utility>
namespace is_nothrow_swappable_impl
{
using std::swap;
template <class T>
struct test
{
static bool const value
= noexcept(swap(std::declval<T&>(),std::declval<T&>()));
};
}
template <class T>
struct is_nothrow_swappable // <= note extra "p"
: std::integral_constant<bool, is_nothrow_swappable_impl::test<T>::value>
{};
struct Q {};
struct R { R(R const&); };
int test1[is_nothrow_swappable<int>::value ? 1 : -1];
int test2[is_nothrow_swappable<Q>::value ? 1 : -1];
int test3[is_nothrow_swappable<R>::value ? -1 : 1];
int main() {}
--8<---------------cut here---------------end--------------->8---
HTH,
--
Dave Abrahams
BoostPro Computing Software Development Training
http://www.boostpro.com Clang/LLVM/EDG Compilers C++ Boost
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]