Описание тега argument-deduction

Вывод аргумента - это особенность языка C++, где компиляторы сравнивают тип параметра шаблона функции с типом соответствующего аргумента вызова. Это позволяет естественный синтаксис вызова для шаблонов функций.
0 ответов

Поддерживаются ли параметры шаблона шаблона для функции в новых стандартах C++?

Я нашел следующее утверждение в книге Шаблон C++: Полное руководство: Параметры шаблона шаблона для шаблонов функций не допускаются. Но он следующий кусок кода компилирует и запускает для меня. template< typename T, template <typename elem,typ…
1 ответ

Вывод аргумента шаблона для параметра указателя переменной функции - обработка неоднозначных случаев

Рассмотрим следующий код: #include <iostream> void f(int) { } void f(int, short) { } template<typename... Ts> void g(void (*)(Ts...)) { std::cout << sizeof...(Ts) << '\n'; } template<typename T, typename... Ts> void h(v…
2 ответа

Почему вывод аргумента шаблона не выполняется для указателя на член-функцию?

С g++ 5.4 это struct B { void f() {} }; struct D : public B { void g() {} }; template <class T> void foo(void (T::*)(), void (T::*)()) {} int main() { foo(&D::f, &D::g); } не удается из-за "выведенных конфликтующих типов для параметра"…
09 ноя '17 в 12:02
1 ответ

Понимание SFINAE

Насколько я знаю, SFINAE означает, что ошибки замещения не приводят к ошибкам компиляции, а просто удаляют прототип из списка возможных перегрузок. Что я не понимаю: почему это СФИНА? template <bool C, typename T = void> struct enable_if{}; te…
24 июл '13 в 09:18
0 ответов

Вывод аргумента шаблона класса с типом enum?

Редактировать: Я считаю, что этот вопрос был ошибочно помечен как дубликат, особенно с учетом "дубликатов". Пожалуйста, смотрите ниже. Сегодня я попытался (впервые) использовать вывод аргументов шаблонной функции. Моя цель - внедрить простую систему…
07 июл '16 в 12:36
1 ответ

Оценить переменные параметры из виртуального стека

Я делаю небольшой движок скриптов на основе стека для изучения встроенных скриптов в C++. Цель состоит в том, чтобы иметь возможность зарегистрировать любой std::function быть вызванным скриптом. То, что я имею сейчас, по сути class Bytecode { priva…
1 ответ

C++: как я могу перегрузить функцию, чтобы она могла принимать любой функтор, включая указатель на функции-члены?

Чтобы расширить мое понимание C++11, я экспериментирую с написанием функциональных помощников и выясняю, смогу ли я назвать их менее многословными. Прямо сейчас я пытаюсь написать some функция, которая возвращает true, если какой-либо элемент в колл…
22 ноя '16 в 01:28
1 ответ

Ссылка на l-значение удержания шаблона функции и универсальная ссылка

Допустим, у меня есть функция copy: template <typename Buf> void copy( Buf&& input_buffer, Buf& output_buffer) {} В котором input_buffer является универсальной ссылкой и output_buffer является ссылкой на значение l. Reference colla…
2 ответа

Сбой вычета аргумента шаблона и несоответствие параметров и параметров функции

Рассмотрим следующую программу: template <class T> struct A { using X = typename T::X; }; template <class T, typename A<T>::X* = nullptr> void f(T, int); void f(...); template <class T> void g(T, int, typename A<T>::X* …
2 ответа

Вложение вложенного аргумента шаблона для шаблонов классов не работает

В этих вопросах и ответах я написал небольшой класс-обертку, который предоставляет обратный итератор для доступа к диапазону, полагаясь на вывод аргумента шаблона функции языка C++1z для шаблонов классов ( p0091r3 , p0512r0 ) #include <iostream&g…
1 ответ

Экспресс ограничения при использовании шаблонов C++

У меня есть класс Wrapper. Любые T или объекты, полученные из T, должны быть конвертируемыми в этот Обертку. Я также хотел бы, чтобы любой объект из Someclass или объекты, производные от SomeClass, были конвертируемыми в Wrapper. Реализация в обоих …
29 окт '18 в 05:58
1 ответ

Почему не работает мой пакет параметров шаблона?

Я пытался получить шаблонную функцию для вызова набора аналогичных функций, чтобы избежать шаблонов. FooA(float a, Widget* w); FooB(int b, Widget* w); FooC(int c, Widget* w); FooD(int d, int e, Widget* w); template <typename... Args> static vo…
17 ноя '15 в 02:52
1 ответ

Почему этот шаблон не работает

Этот код не будет компилироваться с clang++ 6.0 или g++4.9.1 (код не имеет смысла, но это минимальный пример, который делает это возможным): #include <forward_list> template<typename T> T getItem(typename std::forward_list<T>::cons…
10 ноя '14 в 11:26
1 ответ

Передавая функцию как тип шаблона и вычитая ее типы в C++

double f(const int& i) { return 1.5 * i; } template< typename _out, typename _in, _out (*__f)(const _in&)> class X {}; // template <... __f> class X {}; int main() { X<double, int, f> x; // X<f> x; } Как я могу упрост…
3 ответа

Почему выведение аргументов не допускается в типе возвращаемого значения функции?

Самый очевидный ответ может быть - потому что стандарт говорит так.Это нормально, но я оборачиваюсь вокруг этого, чтобы понять причины этого выбора. Рассмотрим следующий пример: template<typename T> struct S { S(T) {} }; S f() { return 0; } in…
1 ответ

Как работает вывод аргумента шаблона, когда перегруженная функция используется в качестве аргумента?

Это более сложный вопрос, упомянутый в разделе Как работает разрешение перегрузки, когда аргумент является перегруженной функцией? Ниже код компилируется без проблем: void foo() {} void foo(int) {} void foo(double) {} void foo(int, double) {} // Unc…
1 ответ

Как проще всего создать локальную переменную того же типа, что и выведенный аргумент?

А именно: [](auto const& foo) { ??? bar; // should be same base type as foo, minus const& } Пока что я использую: typename std::remove_const<typename std::remove_reference<decltype(foo)>::type>::type combination Но я действительн…
07 июн '14 в 03:13
1 ответ

Почему компилятор не может определить параметр автоматического шаблона, если я не добавлю const?

У меня недавно была проблема с кодом, подобным этому: constexpr auto lambda = []{}; template<auto& l> struct Lambda {}; template<auto& l> void test(Lambda<l>) {} int main() { test(Lambda<lambda>{}); } И Clang, и GCC г…
2 ответа

Как получить указатель на ссылочный член?

Рассмотрим этот код: struct AA { int& rr; }; Есть ли способ получить указатель (или, возможно, ссылку) на AA::rr чтобы получить это? AA* aa; auto mm = &AA::rr; // error: cannot create pointer to reference member ‘AA::rr’ aa ->* mm; Также …
1 ответ

Вывод типа для нежизнеспособных шаблонов функций

В своем ответе на этот вопрос и в разделе комментариев Johannes Schaub - litb говорит, что при попытке сделать вывод типа шаблона для шаблона функции, который требует больше аргументов, чем было передано, возникает "ошибка соответствия": template&lt…