Название: SFINAE Способ определения наличия оператора у класса Отправлено: navrocky от Апрель 03, 2015, 13:24 Перебрал несколько способов на stackoverflow определить наличие оператора "==" у класса при помощи SFINAE. Но они не рабочие.
Первый способ: Код
Студийный компилятор не определяет отсутствие оператора == у struct NoOperator. Второй вариант с перегрузкой оператора ==: Код
Но он не собирается для shared_ptr на всех компиляторах. Можно ли как-то починить первый способ или есть лучшее решение? Буст не предлагать, хотелось бы обойтись только стандартом C++11 Тестить код можно здесь: http://rextester.com/RBJVR88775 Название: Re: SFINAE Способ определения наличия оператора у класса Отправлено: m_ax от Апрель 03, 2015, 15:46 Вот мой вариант:
http://rextester.com/WYAQ45377 (http://rextester.com/WYAQ45377) :) Чуть подправил: http://rextester.com/BCLCC21973 (http://rextester.com/BCLCC21973) Название: Re: SFINAE Способ определения наличия оператора у класса Отправлено: navrocky от Апрель 03, 2015, 17:07 Спасибо, помогло.
И мой второй способ также заработал. Это: Код заменил на это: Код
Ваш код более красивый, его возьму. По сути получилось обойтись без SFINAE. Это я всё свой variant курочу https://github.com/navrocky/Variant ) Название: Re: SFINAE Способ определения наличия оператора у класса Отправлено: m_ax от Апрель 03, 2015, 17:13 И ещё..
Я бы не привязывался к сравнению размеров, т.е.: Код
Всё же сравнение по типу более логично в данном случае, имхо.. Но дело, конечно, ваше) И ещё.. Вы так и не поправили тот потенциальный баг (о котором я уже говорил) в методе Код
:( Название: Re: SFINAE Способ определения наличия оператора у класса Отправлено: navrocky от Апрель 03, 2015, 17:25 И ещё.. СогласенЯ бы не привязывался к сравнению размеров, т.е.: И ещё.. Вы так и не поправили тот потенциальный баг (о котором я уже говорил) в методе Код
:( Исправил. Спасибо Название: Re: SFINAE Способ определения наличия оператора у класса Отправлено: m_ax от Апрель 03, 2015, 19:01 Да, и ещё одно маленькое замечание: Наверное лучше использовать std::declval вместо конструкции типа:
Код
http://rextester.com/FTVPW47047 (http://rextester.com/FTVPW47047) |