я хотел бы рассмотреть «правильную» для реализации is_swappable
быть следующим:Что такое правильный способ реализации is_swappable для тестирования концепции 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
без компилятора помощи?
начать с создания 'зЬй :: false_type swappable_test (...)' шаблон двухпараметрическое а –
@PiotrS.Woops, вот почему это не работает. Отредактировано в моем вопросе и удалило ссылку coliru. – orlp
И вы посмотрели [is_nothrow_swappable] (https://github.com/acmorrow/error_or/blob/master/detail/is_nothrow_swappable.hpp) на [acm] (https://stackoverflow.com/questions/ 14483105/почему-это-это-замена-и-это-nothrow замены-не-включено-в-c11)? –