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

Вывод аргументов шаблона - это попытка компилятора вывести аргументы шаблона, когда некоторые из них опущены.
2 ответа

Автоматическое выведение типов шаблонов, путающие указатели и ссылки

Пытаясь отладить некоторый код, я создал класс, который выводит значения сложной иерархии объектов в текстовый файл, чтобы я мог сравнить случай, когда он работает, со случаем, когда это не так. Я реализовал класс следующим образом (приведен простой…
22 сен '17 в 09:39
1 ответ

Шаблонный аргумент и вывод параметров std::function

Предположим, есть функция шаблона foo() который принимает произвольное количество аргументов. Учитывая последний аргумент, всегда std::functionкак мне реализовать foo() шаблон показан ниже таким образом, что CbArgs будет содержать это std::functionп…
1 ответ

Разрешение перегрузки шаблона функции с двумя пакетами параметров

Рассмотрим следующий код: #include<iostream> template<class..., class... T> int f(T...) { return 1; } template<class... T> int f(T...) { return 2; } int main() { std::cout << f(1); } Компилирует и печатает 1 на gcc 8.2, но не…
0 ответов

Авто в качестве аргумента шаблона

template<typename> struct CL{}; CL<char> fnc(); int main() { CL<auto> cl=fnc(); //error } Почему это не правильно? В чем проблема вывести авто как символ?
12 апр '15 в 14:28
0 ответов

Вывести параметр шаблона внешнего класса в вызов функции вложенного класса?

Есть ли способ вывести внешний шаблон во вложенном классе? template<class T> struct A{ struct B{}; }; template<class T> void f(typename A<T>::B b){} // hard to deduce T? int main(){ A<double>::B b; f(b); // no matching functi…
0 ответов

"автоматическая" разница между указателями и ссылками

Учитывая этот код: int& some_class::ret_ref(){ return this->some_integer; } int* some_class::ret_ptr(){ return &(this->some_integer); } int main(){ some_class c; auto p=c.ret_ptr(); auto r=c.ret_ref(); } Во время компиляции: p является…
25 июл '16 в 21:45
2 ответа

Как make_pair неявно выводит типы?

Хорошо известно, что make_pair выводит типы. Вот почему это существует, и это удобно. Теперь посмотрим на этот пример: std::pair <int,int> foo; std::pair <int,int> bar; foo = std::make_pair (10,20); bar = std::make_pair (10.5,'A'); //ok:…
25 фев '13 в 06:27
1 ответ

Какой шаблон foo будет создан?

Учитывая этот код: #include <type_traits> template<char ...Cs> auto foo() -> typename std::enable_if<(sizeof...(Cs) > 1)>::type{ } template<char C> void foo() { } int main(){ foo<'s'>(); } У меня есть вышеупомянут…
3 ответа

Лямбда преобразуется в bool вместо определения типа указателя на функцию

Я хотел реализовать перегрузку для operator<< это позволило мне вызвать данную функцию и вывести результат. Поэтому я написал перегрузку, но преобразование в bool выбрано, и при написании функции оно не компилируется. РЕДАКТИРОВАТЬ: Знайте, чт…
0 ответов

C++17 шаблонный конструктор класса удержания шаблона

Вопрос тесно связан с недавно реализованным выводом шаблона класса C++17 из параметров конструктора. На самом деле это то, что я пытаюсь сделать: template<typename H, typename B> struct A { typedef H value_type; template<typename I> A(B …
28 ноя '18 в 07:22
1 ответ

Должен ли "вывод аргументов шаблона для шаблонов классов" выводить пустые пакеты параметров для шаблонов классов с переменным числом аргументов?

Предложение "Вычет аргументов шаблона для шаблонов классов" ( P0091R2) содержит следующий пример: template<class ... Ts> struct X { X(Ts...) }; X x1{1}; // OK X<int> X x11; // OK X<> (Помимо того факта, что в определении конструкто…
1 ответ

Параметр шаблона std::function не может быть выведен

Я работаю над кодом, как следующий #include <functional> template <typename Type> void foo(const std::function<void(const Type&)> & handler) {} void goo (const int&){} int main() { foo([](const int&){}); foo(goo); }…
2 ответа

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

Следующая игрушечная программа преобразует тип музыки в соответствующий цвет. Он компилируется и выполняется просто отлично - преобразование COUNTRY терпит неудачу, как и ожидалось, и conversion() функция возвращает значение по умолчанию, WHITE, Одн…
16 июл '15 в 19:04
1 ответ

Прекрасно переадресация функции оболочки?

Рассмотрим следующий функтор, чтобы помочь определить, какая версия его operator() называется. struct functor { void operator()() {std::cout << "functor::operator" << std::endl;} void operator()() const {std::cout << "functor::oper…
2 ответа

Что такое шаблоны вывода и когда мы должны их использовать?

Стандарт C++17 вводит "руководство по выводу шаблона". Я полагаю, что они имеют какое-то отношение к новому выводу аргументов шаблона для конструкторов, представленному в этой версии стандарта, но я еще не видел простого объяснения в стиле FAQ того,…
03 дек '16 в 19:35
2 ответа

Получить типы классов для шаблонов

У меня есть функция шаблона, как это: template<class RandomAccessIterator, class T, class Func> T reduce(RandomAccessIterator first, RandomAccessIterator last, const T& initial_value, Func func) { // Some code; return cur_value; } Я не мог…
1 ответ

Вывод аргумента шаблона для указателя на функцию (g++ и ICC против Clang++ и VC++)

Рассмотрим следующую программу: #include <iostream> template <typename T> void foo(const T* x) { x(); } void bar() { std::cout<<"bar() is called\n"; } int main() { foo(bar); } Хорошо компилируется на clang++ & VC++ но g++ выдает сл…
1 ответ

Вывод LValue Тип ссылки

Существует довольно много дискуссий и разъяснений относительно вывода аргументов шаблона и, в частности, свертывания ссылок и "универсальных ссылок". Этот вопрос проходит через соответствующие детали: как автоматически выводить тип? и эта статья Ско…
3 ответа

Шаблон функции не может определить тип, если типы T и U совпадают

Этот вопрос связан с ответом, который я получил вчера. Для следующей функции я получаю ошибку couldn't deduce template parameter ‘V’ если оба T а также U являются std::complex<double>, Если T а также U отличаются, функция компилируется и работ…
26 июл '13 в 18:47
2 ответа

Вычитание шаблона C++ не работает

Для следующего кода: #include<functional> template<typename T> void f(std::function<void(T)> g) { } template<typename T> void g(T x) { } int main() { f(&g<int>); } Компилятор C++14 выдает ошибку: no matching functio…