Описание тега sfinae

Ошибка замены не является ошибкой. Это метод программирования на C++, который позволяет шаблонам проверять свойства своих параметров шаблона, что позволяет использовать различные специализации, если доступны определенные виды объектов.
2 ответа

Можно ли обнаружить константность метода класса, используя SFINAE?

Рассмотрим эту структуру: struct foo { void dummy() const {} }; Можно ли обнаружить константность этого метода с помощью SFINAE? Например, я хотел бы захватить это свойство в черту, которая может быть использована в static_assert: static_assert(is_c…
21 дек '12 в 15:30
1 ответ

SFINAE: удалить функцию с тем же прототипом

Интересно, в чем разница между этим кодом, который работает: #include <type_traits> #include <iostream> template<typename T> using is_ref = std::enable_if_t<std::is_reference_v<T>, bool>; template<typename T> usin…
20 май '18 в 23:41
3 ответа

Использование SFINAE с общими лямбдами

Могут ли общие лямбды воспользоваться правилом "Ошибка замещения - это не ошибка"? пример auto gL = [](auto&& func, auto&& param1, auto&&... params) -> enable_if_t< is_integral< std::decay_t<decltype(param1)> &…
06 июл '15 в 19:17
1 ответ

Всегда ли необходимо дублировать параметр шаблона класса при включении конструкторов на его основе?

Вообще при использовании enable_if на основе типа шаблона класса необходимо продублировать тип шаблона класса в качестве параметра шаблона конструктора или метода: template < typename U = T, typename = typename std::enable_if< !std::is_void&lt…
23 авг '16 в 11:50
1 ответ

Ошибка при замене шаблона, сообщенная компилятором

Я вижу ошибку сборки, которая является правильной, но что-то, что я ожидал бы игнорировать из-за правила "Ошибка замены не является ошибкой": C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\vector(895): error C3699: '&&': cann…
09 авг '17 в 18:43
1 ответ

SFINAE: decltype для оператора []

На основе ответов здесь и здесь я пытаюсь использовать следующее template <typename T> using operator_square_brackets = decltype(&T::operator[]); Это терпит неудачу на визуальной студии с error C2760: syntax error: expected ')' not ']' Люб…
21 июл '17 в 06:54
1 ответ

Почему sfinae перегрузка не решена

Эта версия отлично работает: template<typename T> struct Foo { template<typename U = T> typename std::enable_if<std::is_same<U,A>::value>::type bar() { std::cout << "1" << std::endl; } template<typename U = T&g…
06 июн '18 в 08:47
2 ответа

Определение шаблонных методов с помощью SFINAE

У меня есть простая черта struct hasMemberSerialize что я пытаюсь использовать, чтобы определить, совместим ли какой-либо данный класс с callSerialize(), struct выглядит так: template<typename Type, typename ArchiveType> struct hasMemberSerial…
14 окт '18 в 17:36
2 ответа

SFINAE отправка между недействительным и недействительным методом

У меня есть что-то вроде следующего: template <typename T> struct Base { auto func() { // do stuff auto x = static_cast<T&>(*this).func_impl(); // do stuff return x; } }; struct A : Base<A> { int func_impl() { return 0; } }; st…
19 дек '17 в 15:51
1 ответ

Есть ли способ использовать SFINAE, чтобы определить, не объявлена ​​ли не шаблонная функция, не являющаяся членом?

Я пытаюсь ответить на этот вопрос, используя SFINAE и decltype. Подводя итог, автор должен получить функцию, которая действует по-разному в зависимости от того, объявлена ​​ли другая функция в модуле компиляции (будь то объявлена ​​раньше или позже,…
17 сен '15 в 13:43
2 ответа

Специализация шаблона с аргументом по умолчанию

У меня есть программа, которая заключается в следующем. Есть базовый шаблон struct X и частичная специализация с SFINAE. template <typename T, typename U = void> struct X{ X() { std::cout << "in 1" << std::endl; }; }; template <…
1 ответ

SFINAE проверка для оператора [] более запутана, чем я?

Я написал простой чек для operator[], но has_subscript_op экземпляр шаблона структуры выбирает неправильную перегрузку: #include <iostream> #include <type_traits> #include <string> #include <map> template<class, class, cla…
23 сен '16 в 14:15
1 ответ

Соответствие функции-члена существования и подписи: параметры

Чтение связанных вопросов "Как вызывать функцию-член, только если объект имеет ее?" и "Можно ли написать шаблон C++ для проверки существования функции?" Я реализую свой собственный класс черт. Цель очень проста, хотя я не могу достичь того, что хоте…
24 дек '14 в 06:32
0 ответов

Документирование перегруженных функций SFINAE с помощью Doxygen

Я пытаюсь документировать следующие перегруженные функции SFINAE (обе) с помощью Doxygen 1.8.11: template <typename T, typename std::enable_if< std::is_integral<T>::value, int >::type = 0> auto func(T x); template <typename T, t…
12 апр '16 в 13:05
1 ответ

MSVC10 SFINAE вызывает фатальную ошибку, а не ошибку замещения

У меня есть (относительно) краткий пример кода здесь. #include <type_traits> template<typename T> class function; template<typename Ret> class function<Ret()> { public: template<typename Func> function(Func f, typename …
15 май '11 в 16:06
2 ответа

"Что случилось с моим SFINAE"?

Я новичок в написании шаблонов метапрограммирования кода (вместо того, чтобы просто читать его). Так что я сталкиваюсь с некоторыми проблемами с нубами. Один из них довольно хорошо описан в посте, не относящемся к SO, который называется "Что случило…
2 ответа

В MSVC2015 обнаружен неправильный вывод для члена SFINAE

Я узнал о SFINAE и о том, как легко реализовать его с void_t, Но я получаю разные выходные данные для разных компиляторов: //pre c++17 void_t definition: template<class... Ts> struct make_void {typedef void type;}; template<class... Ts> …
16 сен '16 в 16:37
1 ответ

Устранить неоднозначность перегрузки с помощью SFINAE

Я обнаружил похожие случаи, но они обычно заканчивали тем, что я (думаю) делаю здесь. Я хочу иметь возможность вызывать функцию с одним или несколькими параметрами, очевидно, если функция существует с перегрузками с несколькими параметрами, правильн…
09 мар '15 в 09:40
1 ответ

Пакет параметров с совпадением типа предыдущего параметра

Поэтому я использую простой пример, чтобы попытаться понять шаблоны с переменным числом аргументов и некоторые приемы tmp. Пример состоит из класса Timer, у которого есть метод toc(). Методы toc используются для остановки таймера и вызова функции, к…
17 сен '18 в 22:15
1 ответ

Условная компиляция метода-члена void с использованием enable_if

, #include <iostream> #include <type_traits> using namespace std; template<typename T> struct MyClass{ void hello( void) { hello(std::is_same<T,bool>()); } void hello(std::true_type){ cout<<"hello only for bools"<&lt…
04 янв '17 в 22:03