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

Template argument deduction is a compiler attempt to deduce template arguments when some are omitted.
7 ответов

Использовать один аргумент для вывода параметров шаблона?

Допустим, у меня есть функция шаблона, assign(), Он принимает указатель и значение и назначает значение цели указателя: template <typename T> void assign(T *a, T b) { *a = b; } int main() { double i; assign(&i, 2); } В этом случае я всегда…
6 ответов

Вывести нетипичный параметр шаблона

Можно ли вывести нетипичный параметр шаблона из параметра функции шаблона? Рассмотрим этот простой шаблон: template <int N> constexpr int factorial() { return N * factorial<N - 1>(); } template <> constexpr int factorial<0>()…
1 ответ

Руководство по частичному выводу C++17

Я пытаюсь написать руководство по выводу, которое обнаруживает только одно из множества typename из данного аргумента конструктора и требует от пользователя ввода int size вручную template <int size, typename T> struct Board { array<array&l…
1 ответ

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

template<class T> void fn(T t){} template<class T> void fn(std::vector<T> vt){} void f() { std::vector<int> vt; fn(vt); } Я знаю, что будет вызвана вторая функция шаблона, но я не знаю правил сопоставления функций шаблона.
0 ответов

Почему в таком случае не работает вывод аргументов шаблона класса?

#include <vector> template<typename T> struct A : public std::allocator<T> { }; template<typename T> using V = std::vector<T, A<T>>; int main() { auto v1 = std::vector{1, 2, 3}; // ok auto v2 = V{1, 2, 3}; // erro…
1 ответ

std::basic_string как параметр шаблона функции не может быть выведен из const char*

Почему ставит std::basic_string как параметр шаблона функции не сможет вывести из const char*, но его можно успешно вывести, когда он построен напрямую? #include <string> #include <iostream> template<class Char/*, class Traits, class …
0 ответов

Невозможно вывести параметр шаблона из зависимой области

Я хочу вызвать функцию шаблона с выведенным вторым параметром шаблона. Функция шаблона опирается на два типа шаблона и принимает их аргумент и типы возвращаемых значений из зависимой области. Рассмотрим следующий пример: struct A { struct S { int a;…
18 июн '20 в 15:25
1 ответ

Типы классов C++ в параметрах шаблона, не являющихся типами: руководство по выводам не работает

Проблема Я использую функцию С ++2a, которая позволяет использовать структуры / std::array в качестве аргументов шаблона (g++-9.2.0, не поддерживается в clangпока что). Функция называетсяClass types in non-type template parameters и предложено в P07…
1 ответ

Лямбда высокого порядка С ++ не может вывести возвращаемый тип лямбда

У меня есть задание создать практически универсальный класс, который получает какой-то входной источник целых чисел и какой-то потребитель, который потребляет эти входные данные. Мне это удалось, но это уродливее, чем мне хотелось бы. Так что это ча…
1 ответ

Конструкторы C++ с 0/1 аргументом не связываются должным образом при передаче в конструктор шаблона

В приведенном ниже примере кода у меня есть класс с шаблонным конструктором с одним аргументом, который называется Acceptor1. Я хочу передать объекты типаFoo, Bar, or Bazк его конструктору, связывая вызовы конструктора. (На самом деле этот упрощенны…
2 ответа

Аргумент шаблона по умолчанию теряет свой ссылочный тип

Рассмотреть возможность #include <iostream> #include <type_traits> template <class T, class ARG_T = T&> T foo(ARG_T v){ return std::is_reference<decltype(v)>::value; } int main() { int a = 1; std::cout << foo<int…
2 ответа

Ошибка замены с `std::function` и ранее выведенным параметром шаблона - почему?

Рассмотрим следующий код: template <typename> struct S { }; void g(S<int> t); template <typename T> void f(T, std::function<void(S<T>)>); При попытке вызвать f(0, g); Я получаю следующую ошибку: error: no matching funct…
2 ответа

Как разрешить функции принимать указанные типы?

Поэтому я хочу, чтобы моя функция принимала шаблонный параметр, примерно так: template <typename T> void foo(T test) Я только хочу fooпринять все эти типы, которые я укажу. Скажи, что у меня есть что-то вродеImage<cam1>, Image<cam2&gt…
1 ответ

Возможен ли вывод аргументов "глубокого" шаблона?

Дело в том, что у меня есть функция шаблона, и я хочу использовать ее как обратный вызов: template <class ...Ind> void fill_given_rows(mat& matrix, Ind ...ind){ Он вызывает такую ​​функцию-член класса: template<typename F, class ... Arg…
3 ответа

Получить тип аргументов функции как кортеж

Проблема Для любого типа функции (или вызываемого) Function, как мне получить все его типы аргументов как кортеж? Например, мне нужна черта function_traits<Function>::arguments, где: int f(); typename function_traits<decltype(f)>::argume…
2 ответа

Функция шаблона Variadic для создания строки

Я новичок в вариативных шаблонных функциях. Я написал простой класс,StringStream, который имеет вариативную функцию шаблона, которая создает std::string из переменных аргументов шаблона - строк, целых чисел и т. д. #include <string> #include &…
1 ответ

Назначенные инициализаторы C++20 с шаблонными типами

Как назначенные инициализаторы (C++20) должны работать с CTAD? Этот код отлично работает в gcc9.2, но не работает с clang8 template <typename int_t=int, typename float_t=float> struct my_pair { int_t first; float_t second; }; template<typen…
1 ответ

Руководства по выводам std::set работают не так, как я ожидал

Я ожидаю, что руководства по дедукции правильно выведут тип в приведенном ниже примере, но они этого не делают: #include <set> struct Foo { }; bool cmp(const Foo&, const Foo& ); std::set my_set({Foo{}, Foo{}}, cmp); Ошибка компилятора …
30 сен '19 в 18:15
0 ответов

Выведение параметра шаблона из параметра конструктора constexpr

У меня есть функция форматирования строки, которая предназначена только для приема строкового литерала в качестве строки формата. Я хотел бы подсчитать количество заполнителей формата во время компиляции и статического утверждения, что количество за…
1 ответ

Непонимание вариативных шаблонов и вывода типа шаблона

Я компилирую C++17 с кодом, похожим на этот пример: #include <iostream> #include <iterator> class Foo {}; template <typename... Args, typename ostream_type = ::std::basic_ostream<Args...>, typename ostreambuf_iterator_type = ::s…