я пытаюсь привыкнуть к некоторым понятиям tmp.
Вот одно из решений, позволяющее проверить, можно ли назначить 2 типа: Это самая важная часть:
template<typename _Tp, typename _Up>
class __is_assignable_helper: public __sfinae_types {
template<typename _Tp1, typename _Up1>
static decltype(std::declval<_Tp1>() = std::declval<_Up1>(), __one())
__test(int) {}
template<typename, typename>
static __two __test(...) {}
public:
static constexpr bool value = sizeof(__test<_Tp, _Up>(0)) == 1;
};
Теперь я попытался использовать некоторые другие трюки со сфинами, но это не сработало.
template<typename _Tp, typename _Up, typename = void>
class __is_assignable_helper2
{
public:
static constexpr bool value = false;
};
template<typename _Tp, typename _Up>
class __is_assignable_helper2<_Tp, _Up,
typename std::enable_if<
std::is_same<typename
decltype(std::declval<_Tp>()= std::declval<_Up>(), char)
,char >::value
, void
>::type>
{
public:
static constexpr bool value = true;
};
GCC говорит: ошибка: неправильное количество аргументов шаблона (1, должно быть 2)>::значение
.. Он не принимает decltype в качестве параметра шаблона в is_same.
Может ли кто-нибудь объяснить это сообщение об ошибке? и подскажите решение?
ОБНОВИТЬ:
ХОРОШО ! Оно работает ! я написал char вместо char{}....
Следующая проблема:
Есть ли более элегантная реализация?
std::decltype
не должен компилироваться. Вы имели в виду толькоdecltype
? Кроме того, здесь нет необходимости в ключевом словеtypename
. Это требуется только в том случае, если у вас есть вложенное имя. - person dyp   schedule 03.07.2015void_t
. Вы также можете наследовать отstd::integral_constant
илиstd::bool_constant
(или, я думаю, Уолтер Браун унаследовал отstd::is_same
при реализации этого в своей презентации на CppCon) вместо того, чтобы реализовывать шаблон черты. В любом случае, вы используете зарезервированные идентификаторы а>. Эти имена — все, что есть у разработчиков; не усложняйте им задачу. - person chris   schedule 03.07.2015, char
внутриdecltype
не является выражением. Вы, вероятно, хотите, char{}
. - person dyp   schedule 03.07.2015__
или_
+ заглавную букву. Эти префиксы зарезервированы, и технически это неопределенное поведение. - person Anton Savin   schedule 03.07.2015