2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 04:59 


28/07/13
165
Пример:
Код:
template<typename T>
void foo(T &x, T y) {
    x = y;
}

Если затем я напишу
Код:
unsigned char a;
foo(a, 0);

компилятор выведет ошибку, потому что он вывел тип T для первого аргумента как unsigned char, а для второго int.

Есть ли способ заставить компилятор не выводить тип второго аргумента, а и пользовать ужн выведенный из первого аргумента тип T?

Ограничения: С++ не новее c++14, нет STL (компилятор avr-g++).

 Профиль  
                  
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 10:19 
Заслуженный участник


28/04/09
1933
Надо поместить тип второго аргумента в т.н. non-deduced context:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>


template <typename T>
struct identity
{
    using type = T;
};

template <typename T>
using identity_t = typename identity<T>::type;


template <typename T>
void foo(T& x, identity_t<T> y)
{
    x = y;
}

int main()
{
    unsigned char a;
   
    foo(a, 65);
   
    std::cout << "a = " << a << std::endl;
}

Alias template identity_t здесь нужен только для сокращения и очищения кода (если подобных мест у Вас несколько). Вместо него везде, где нужен non-deduced context для параметра шаблона T, можно просто писать typename identity<T>::type (хотя выглядит это не слишком просто :-) ).

 Профиль  
                  
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 10:53 


28/07/13
165
Спасибо. Я тут ещё нагуглил, что шаблоны поддерживают параметры по умолчанию. Если сделать так
Код:
template <typename T, typename U = T>
void foo(T &x, U y) { x = y; }

это будет работать? Сейчас нет доступа к компьютеру, чтобы проверить.

 Профиль  
                  
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 13:04 
Заслуженный участник


28/04/09
1933
Нет, так работать не будет.

 Профиль  
                  
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 18:43 


28/07/13
165
Ещё вариант:
Код:
template<typename T>
void foo(T &x, decltype(T{}) y)

Лаконично, но тип должен быть default-constructible.

 Профиль  
                  
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 18:56 
Заслуженный участник
Аватара пользователя


16/07/14
9416
Цюрих
user14284 в сообщении #1357663 писал(а):
Код:
template <typename T, typename U = T>
void foo(T &x, U y) { x = y; }

это будет работать?
EtCetera в сообщении #1357695 писал(а):
Нет, так работать не будет.
Работать будет, но инстанцируется в результате foo<char, int>.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Dmitriy40


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group