HLFX.Ru Forum
Показать все 10 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Шаблоны, шаблончики (https://hlfx.ru/forum/showthread.php?threadid=4951)


Отправлено thambs 07-02-2017 в 16:14:

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

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

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


Отправлено XaeroX 07-02-2017 в 18:05:

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

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

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

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

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

__________________

xaerox on Vivino


Отправлено FreeSlave 07-02-2017 в 18:29:

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


Отправлено thambs 13-02-2017 в 15:18:

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


Отправлено XaeroX 13-02-2017 в 16:41:

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

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

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

__________________

xaerox on Vivino


Отправлено Дядя Миша 13-02-2017 в 17:55:

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

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено thambs 14-02-2017 в 09:16:

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

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


Отправлено XaeroX 14-02-2017 в 14:15:

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

__________________

xaerox on Vivino


Отправлено thambs 14-02-2017 в 14:25:

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


Отправлено XaeroX 14-02-2017 в 15:47:

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

__________________

xaerox on Vivino


Временная зона GMT. Текущее время 15:04.
Показать все 10 сообщений этой темы на одной странице

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