LINUX.ORG.RU

Можно ли передавать лямбда-функцию в качестве параметра шаблона?

 


0

2

Сабж. Указатель на обычную функцию можно,

#include<stdio.h>

template <typename T, void (*func)(T&)> void myforeach(T *p, int N){
	for(int i=0; i<N; i++) func(p[i]);
}

void f(int& x){ printf("%i\n", x); }

int main(){
	int a[10];
	myforeach<int, f>(a, 10);
	return 0;
}

а как быть с лямбдами?

★★★★★
template <typename T, typename F> void myforeach(T *p, int N){
	for(int i=0; i<N; i++) F(p[i]);
}

вообще просто тупо посмотри в stl

ckotinko ☆☆☆
()

Вообще можно, но только если эта лямбда имеет статический класс памяти (что логично, потому что нужен её адрес на этапе компиляции) http://ideone.com/7G3uTn , из-за чего это становится весьма бесполезным.

Если я правильно предполагаю возможное использование, то гораздо лучше будет использовать обычную шаблонную функцию http://ideone.com/Oa0Qrj .

Q3164
()
Ответ на: комментарий от Q3164

Спасибо. Т.е. захвата переменных снаружи и замыканий при этом не добиться...

AIv ★★★★★
() автор топика
#include <cstdio>
#include <functional>

template <typename F, typename T>
void myforeach(const F &f, T *t, const int N)
{
  for(int i=0; i<N; i++) f(t[i]);
}

int main()
{
  int a[10] = {0,1,2,3,4,5,6,7,8,9};
  myforeach <std::function <void (int)>, int> (
    [] (int i) {printf("%d\n", i);}, a, 10);
  return 0;
}
nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

Это понятно и тривиально;-)

При передачи функции через аргумент шаблона компилятору проще оптимизировать.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Каждая лямбда в спп имеет свой, уникальный тип. По этому писать темплейт для лямбд (даже если это можно было бы сделать) не имеет смысла, оно ничем от обычной ф-ии отличаться не будет.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

Не осознал всей глубины Вашей мысли - WTF «писать темплейт для лямбд»? Можно написать

template <typename FT> ... (const FT& func, ...)
и оно съест любую лямбду, и даже само аргумент шаблона выведет (т.е. в данном случае std::function писать не нужно).

Лямбда в _аргумент_ шаблона не лезет поскольку ее нету (как правило) на момент компиляции, она токо в рантайме появляется. А те лямбды, которые на момент компиляции есть неинтересны т.к. они и правда обычные фунцкии.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Ничего что все шаблоны разворачиваются во время компиляции?

Вам бы, батенька, Си++ для чайников осилить для начала.

anonymous
()
Ответ на: комментарий от AIv

На самом деле функцию заинлайнить он может и так, потому что это просто operator() у лямбды, а в рантайме будет передаваться только то, что в квадратных скобках. А тут уж, если оно не константное, его и не заоптимизируешь никак.

Q3164
()
Ответ на: комментарий от Q3164

Да, Вы правы. Вскрытие показывает что в простых случаях он действительно инлайнит лямбду, даже если она идет через аргумент функции а не через аргумент шаблона. Я правда ХЗ как это влияет вообще на качество оптимизации - на простых тестах разницы не видно, а на сложных это долго разбираться... но исходники оказываются зело компактнее, чем если гнать через аргумент шаблона. Так наверное и поступлю, спасибо;-)

У меня на ноуте вообще солид рок, gcc-4.4.5 лямбды не жрет ccскотина;-( Придется обновляться.

AIv ★★★★★
() автор топика

Вам бы, батенька, Си++ для чайников осилить для начала.

А Вам бы, матушка, думать прежде чем писать, и не путать мокрое и соленое.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Лямбда в _аргумент_ шаблона не лезет поскольку ее нету (как правило) на момент компиляции, она токо в рантайме появляется.

не лезет поскольку ее нету

на момент компиляции

она токо в рантайме

рантайме

anonymous
()
Ответ на: комментарий от cdshines

Выпуск еженедельника «Я не умею писать программы более 1000 строк, но буду упорно жрать кактус и выносить мозг окружающим».

anonymous
()
Ответ на: комментарий от anonymous

Да-да. Как обычно статья от анонимного аналитега с ЛОР-а «ТС нуб, я Царь архитекторов и мегагуру от С++!»

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Все знают. Что сказать то хотели? Что Вы не знаете откуда берутся ограничения на аргументы шаблонов не являющиеся типами? Так идите Вандервуда почитайте. Или что Вы не видите разницы между передачей лямбды через аргумент функции и через аргумент шаблона? Так это Вам к какому нить архитектору с железной линейкой, он объяснит.

AIv ★★★★★
() автор топика
Ответ на: ещё раз от anonymous

А вот std::function на оптимизацию повлияет как раз таки явно отрицательно, потому что у него operator() виртуальный.

Q3164
()
Ответ на: комментарий от AIv

Вы абсолютно не понимаете что такое лямбда в крестах (для тупых — это генерируемый компилятором класс). Отсюда ваши страдания.

Также есть подозрения, что и о шаблонах у вас чуть более чем извращённое мнение.

anonymous
()
Ответ на: комментарий от Q3164

выбросьте свой компилятор

В clang, gcc и msvc он статический. Другой вопрос, что хранится указатель на функцию (или объект, если по факту захватываются какие-либо внешние переменные), что делает невозможным её встраивание (если подумать, что ещё можно передать в конструктор?).

anonymous
()
Ответ на: выбросьте свой компилятор от anonymous

Да, я просто думал о том, что вызов будет в любом случае непрямой, что можно сделать через виртуальную функцию или же указателем, а написал фигню.

Самому-то operator() как раз-таки не нужно быть виртуальным скорее всего в любой реализации.

Q3164
()
Ответ на: комментарий от anonymous

Также есть подозрения, что и о шаблонах у вас чуть более чем извращённое мнение.

А у меня есть стойкое ощущение что Вы неадекватны (постоянно находитесь в плену своих странных подозрений). Я был бы Вам крайне обязан, если бы Вы прекратили комментировать мои темы. Если я Вас ни с кем не путаю, уже вторую тему подряд Вы не в силах выдать ни одного комментария по делу, кроме того мне не нравиться Ваш тон.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Я не червонец чтобы всем нравиться

А ваша дремучая безграмотность оскорбляет славное прошлое этого ресурса.

anonymous
()
Ответ на: комментарий от AIv

ни одного комментария по делу

серьёзно относиться к вашему бреду могут только скорбные умом

anonymous
()
Ответ на: Я не червонец чтобы всем нравиться от anonymous

ваша дремучая безграмотность оскорбляет славное прошлое этого ресурса.

Зато Ваша упоротость полностью в духе и прошлого и настоящего этого славного ресурса.

серьёзно относиться к вашему бреду могут только скорбные умом

«Жалкие, ничтожные люди!» Берегите свою лысину, амиго, тщательно протирайте паркет перед тем как об него стучаться. Эк Вас, бедолагу, расколбасило... мне прям даже неловко перед Вашими соседями снизу.

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ну и закати ебало, дебил.

Дебил видно ты, т.к. по делу ничего сказать не можешь.
Вот и пошло поколения безмозглых анонов

Boy_from_Jungle ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.