Я бы рассмотрел "правильную" реализацию для is_swappable
следующим образом:
template<class T, class U = T> struct is_swappable<T, U> : /* see below */ { }
is_swappable
наследует от std::true_type
, если T и U Swappable
, в противном случае от std::false_type
.
Я пробовал много вещей, но SFINAE просто не работает. Это особенно неприятный контрпример:
struct A {
A() {}
~A() {}
A(const A&) = delete;
A(A&&) = delete;
};
Ясно, что A
не Swappable
. Однако любое общее решение, которое я могу придумать, неправильно обрабатывает приведенный выше пример.
Реализация SFINAE Я попытался, но не работал, выглядел так:
namespace with_std_swap {
using std::swap;
template<class T, class U, class =
decltype(swap(std::declval<T&>(), std::declval<U&>()))>
std::true_type swappable_test(int);
template<class, class> std::false_type swappable_test(...);
}
template<class T, class U = T>
struct is_swappable
: decltype(with_std_swap::using_std_swap::swappable_test<T, U>(0)) { };
Есть ли способ кода is_swappable
без помощи компилятора?