Re[13]: lambda являются first class citizens?
От: _NN_ www.nemerleweb.com
Дата: 16.05.18 08:30
Оценка:
Здравствуйте, 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'  
}


Очень удобно.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: lambda являются first class citizens?
От: kov_serg Россия  
Дата: 04.07.18 14:29
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>Скажите, пожалуйста, лямбда выражения в 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;
}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.