Описание тега argument-deduction
Вывод аргумента - это особенность языка C++, где компиляторы сравнивают тип параметра шаблона функции с типом соответствующего аргумента вызова. Это позволяет естественный синтаксис вызова для шаблонов функций.
0
ответов
Поддерживаются ли параметры шаблона шаблона для функции в новых стандартах C++?
Я нашел следующее утверждение в книге Шаблон C++: Полное руководство: Параметры шаблона шаблона для шаблонов функций не допускаются. Но он следующий кусок кода компилирует и запускает для меня. template< typename T, template <typename elem,typ…
02 янв '14 в 05:16
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…
02 апр '15 в 16:09
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…
18 июн '17 в 19:12
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…
06 ноя '18 в 16:19
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* …
27 окт '18 в 18:12
2
ответа
Вложение вложенного аргумента шаблона для шаблонов классов не работает
В этих вопросах и ответах я написал небольшой класс-обертку, который предоставляет обратный итератор для доступа к диапазону, полагаясь на вывод аргумента шаблона функции языка C++1z для шаблонов классов ( p0091r3 , p0512r0 ) #include <iostream&g…
15 фев '17 в 08:33
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; } Как я могу упрост…
16 июл '14 в 11:14
3
ответа
Почему выведение аргументов не допускается в типе возвращаемого значения функции?
Самый очевидный ответ может быть - потому что стандарт говорит так.Это нормально, но я оборачиваюсь вокруг этого, чтобы понять причины этого выбора. Рассмотрим следующий пример: template<typename T> struct S { S(T) {} }; S f() { return 0; } in…
31 май '18 в 10:36
1
ответ
Как работает вывод аргумента шаблона, когда перегруженная функция используется в качестве аргумента?
Это более сложный вопрос, упомянутый в разделе Как работает разрешение перегрузки, когда аргумент является перегруженной функцией? Ниже код компилируется без проблем: void foo() {} void foo(int) {} void foo(double) {} void foo(int, double) {} // Unc…
01 ноя '16 в 09:10
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 г…
18 дек '17 в 07:25
2
ответа
Как получить указатель на ссылочный член?
Рассмотрим этот код: struct AA { int& rr; }; Есть ли способ получить указатель (или, возможно, ссылку) на AA::rr чтобы получить это? AA* aa; auto mm = &AA::rr; // error: cannot create pointer to reference member ‘AA::rr’ aa ->* mm; Также …
08 фев '17 в 17:11
1
ответ
Вывод типа для нежизнеспособных шаблонов функций
В своем ответе на этот вопрос и в разделе комментариев Johannes Schaub - litb говорит, что при попытке сделать вывод типа шаблона для шаблона функции, который требует больше аргументов, чем было передано, возникает "ошибка соответствия": template<…
10 мар '14 в 12:51