Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, _NN_, Вы писали:
_NN>>Если без шаблоном то очевидно никак нельзя заранее указать тип лямбды потому как он выводится из самой лямбды.
_NN>>Однако мы можем указать тип после и передать лямбду в качестве параметра тем самым имея нешаблонную функцию и отвечая требованию 1.
_>Вы смотрите со стороны C++. Если даже если это реализовано неудачно вы будете настаивать на обратном.
_>Вот представте что тип для каждого целого числа был уникален. Очень удобно да?
Добро пожаловать в TypeScript:
const a = 1;
const b = 2;
if (a == b) { // Operator == cannot be applied to type '1' and '2'
}
Очень удобно.
Здравствуйте, Максим Рогожин, Вы писали:
МР>Скажите, пожалуйста, лямбда выражения в C++ являются first class citizens?
Как-то так должны бы были бы выглядеть λ что бы быть first class
#include <stdio.h>
struct Callback {
typedef void (*fn_t)(void *ctx); fn_t fn; void *ctx;
Callback(fn_t fn=0,void* ctx=0) : fn(fn), ctx(ctx) {}
operator bool () const { return !!fn; }
void operator() () const { if (fn) fn(ctx); }
template<class T>Callback(T t) {
static struct L{T t;L(const T&t):t(t){}static void f(void*ctx){((L*)ctx)->t();}}c(t);
fn=L::f;ctx=&c;
};
};
struct A {
void fn() { printf("A(0x%016llX).fn()\n",(long long)this); }
Callback get_fn() {return{[&](){ fn(); }};}
};
int main(int argc,char** argv) {
A a; Callback list[3];
list[0]={[&](){ printf("argc=%d argv[0]=%s\n",argc,argv[0]); }};
list[1]={[=](){
printf("sizeof(Callback)=%d sizeof(void*)=%d sizeof(int)=%d\n",(int)sizeof(Callback),(int)sizeof(void*),(int)sizeof(int));
}};
list[2]=a.get_fn(); // тут бы просто a.fn, но нет этож c++
for(auto item:list) item();
return 0;
}