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
9143
Цюрих
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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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