HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Шаблоны, шаблончики
Продублирую тута, вдруг кто ответит
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



Шаблоны, шаблончики

Есть, например, такой шаблон (метода):

code:
template <typename T> void drawfield(dimension<T>& src, auto func = [](T val){return val;});

Аргумент func -- это некоторая функция для обработки значений из src, которая в тривиальном случае ничего не меняет. Но при попытке вызвать этот метод только с первым аргументом, то копилятор возвращает:
code:
main.cpp:98:26: error: no matching function for call to ‘plots_t::drawfield(dimension<float>&)’ plots.drawfield(cmp.ns); ^ main.cpp:98:26: note: candidate is: In file included from main.cpp:31:0: plots.hpp:25:7: note: template<class T, class auto:1> void plots_t::drawfield(dimension<T>&, auto:1) void drawfield(dimension<T>& src, auto func = [](T val){return val;}); ^ plots.hpp:25:7: note: template argument deduction/substitution failed: main.cpp:98:26: note: couldn't deduce template parameter ‘auto:1’

Шаблоны вида
code:
template <typename T, typename F> void drawfield(dimension<T>& src, function<T(F)> func = [](T val){return val;});

или
code:
template <typename T, typename F> void drawfield(dimension<T>& src, F func = [](T val){return val;});

тоже не прокатывают. Как сделать правильно и ЧЯНДТ?

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 164574

Старое сообщение 07-02-2017 16:14
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
thambs писал:
Продублирую тута, вдруг кто ответит

А какие ресурсы выступают в роли помощников первого уровня, если не секрет?

Цитата:
thambs писал:
ЧЯНДТ

Пытаешься сделать автоматический вывод типа шаблонной функции для параметра, который подразумевает вывод типа из явно переданного значения. Аргументы по умолчанию не могут быть использованы для вывода типа лямбд, потому что это равнозначно выводу типа шаблонного параметра из значения шаблонного параметра по умолчанию, что не работает.
Цитата:
thambs писал:
Как сделать правильно

Ну тут много вариантов, наверное.
Можно создать переменную-лямбду-по-умолчанию и юзать её как дефолтовый аргумент (с типом выведенным через decltype).
А можно тупо завернуть в std::function.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 164576

Старое сообщение 07-02-2017 18:05
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



thambs, это относится к так называемым non-deduced context. http://en.cppreference.com/w/cpp/la...educed_contexts

Вместо дефолтных параметров можно воспользоваться оверлоадингом.

C++ Source Code:
1
template <typename T, typename F>
2
void drawfield(dimension<T>& src, F func)
3
{
4
  ...
5
}
6
 
7
template <typename T>
8
void drawfield(dimension<T>& src)
9
{
10
  drawfield(src, [](T val) {return val;});
11
}

__________________
I'm on github
I'm on opendesktop.org

Сообщить модератору | | IP: Записан
Сообщение: 164579

Старое сообщение 07-02-2017 18:29
- За что?
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



XaeroX
ЛОР.
FreeSlave
Мне вот такой вариант подсказали, его и использовал.

C++ Source Code:
template <typename T, typename F = std::function<PLFLT(T)>>
void drawfield(dimension<T>& src, F func = [](T v){return static_cast<PLFLT>(v);})

__________________
http://www.moddb.com/mods/monorail-quest

Отредактировано thambs 13-02-2017 в 15:37

Сообщить модератору | | IP: Записан
Сообщение: 164693

Старое сообщение 13-02-2017 15:18
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


thambs вот на Лоре и задавай вопросы. Там, по слухам, профессионалы орудуют. Дублировать тут не нужно.

Добавлено 13-02-2017 в 23:41:

Зачем тут второй шаблонный параметр F? Без него всё отлично будет работать через std function. Там точно профессионалы орудуют?

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 164701

Старое сообщение 13-02-2017 16:41
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
XaeroX писал:
Там точно профессионалы орудуют?

А кто же по твоему писал линукс?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 164706

Старое сообщение 13-02-2017 17:55
-
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



XaeroX
>Зачем тут второй шаблонный параметр F? Без него всё отлично будет работать через std function
Не срабатывает. Точнее, если сделать без второго параметра, то он не принимает лямбду.

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 164732

Старое сообщение 14-02-2017 09:16
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


thambs у меня принимает, я специально проверял. Gcc последней версии?

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 164737

Старое сообщение 14-02-2017 14:15
-
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



XaeroX
g++-4.9. Хмм. А скинь как ты делал?
У меня шаблон метода:

C++ Source Code:
1
class plots_t{
2
public:
3
  /* some stuff */
4
  template <typename T, typename F = function<PLFLT(T)>>
5
  void drawfield(dimension<T>& src, F func = [](T v){return static_cast<PLFLT>(v);}){
6
    /* method stuff */
7
  };
8
};

И там же для удобства определены часто используемые лямбды:
C++ Source Code:
auto PLLOG10 = [](float val){return (val > 0) ? PLFLT(log10(val)) : (PLFLT)(NAN);};
auto PLNONZERO = [](float val){return (val > 0) ? PLFLT(val) : (PLFLT)(NAN);};

И если я вызываю, например, так:
C++ Source Code:
plots.drawfield(op.cmps[0].ns, PLLOG10);

То шаблон без F не раскрывается. Я понять не могу где налажал. Вроде по смыслу, F не нужно и поведение детерменировано, но без него не компилируется.

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 164740

Старое сообщение 14-02-2017 14:25
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


thambs сейчас, как ты понимаешь,я скинуть ничего не могу. Попозже. Но вообще я просто взял твой не компилировавшийся шаблон из 1 поста и добавил обвёртку из std function.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 164752

Старое сообщение 14-02-2017 15:47
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 12:29. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Шаблоны, шаблончики
Продублирую тута, вдруг кто ответит
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024