Ленивый вызов
От: swingus  
Дата: 08.04.15 16:28
Оценка:
Есть кортеж объектов вида (псевдокод):


struct s0
{
 int id = 0;
 int exec(int) { return 0; }
};

struct s1
{
 int id = 1;
 int exec(int, char const *) { return 1; }
};

using ss = boost::fusion::vector<s0, s1>;


Я пытаюсь сделать такой вызов:


template <typename... TArgs>
int call(int id, TArgs &&... args)
{
   int res{-1};

   ss ss_;
   find_by_id   // некий алгоритм, который может искать runtime в кортежах, и
                // в случае нахождения, выполняет лямбду
   (
    ss_, 
    id,
    [&res, &args](auto const &s) 
    { 
      res = s.exec(std::forward<TArgs>(args)...); 
    }
   );
   return res;
}

int main()
{
  call(1, "abc");
  return 0;
}


Этот код не скомпилируется, так как у методов exec() для разных структур не совпадают сигнатуры. Вопрос, можно ли сделать ленивый вызов метода?
Re: Ленивый вызов
От: uzhas Ниоткуда  
Дата: 08.04.15 16:38
Оценка: +2
Здравствуйте, swingus, Вы писали:

S>Этот код не скомпилируется, так как у методов exec() для разных структур не совпадают сигнатуры. Вопрос, можно ли сделать ленивый вызов метода?


что вы ожидаете при вызове
call(0, "abc");
?
Re[2]: Ленивый вызов
От: swingus  
Дата: 08.04.15 17:10
Оценка:
undefined behaviour

Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, swingus, Вы писали:


U>что вы ожидаете при вызове

U>
U>call(0, "abc");
U>
?
Re: Ленивый вызов
От: VTT http://vtt.to
Дата: 08.04.15 17:28
Оценка:
Здравствуйте, swingus, Вы писали:

S>Этот код не скомпилируется, так как у методов exec() для разных структур не совпадают сигнатуры. Вопрос, можно ли сделать ленивый вызов метода?


Лучше поясните, что вы имеете ввиду под "ленивый".
Вообще ленивость (lazy evaluation) подразумевает разнесение по времени инициализации вычисления и собственно вычисления, которое начнет выполняться только когда (и если) кому-нибудь понадобится его результат. Т.е. надо в какой-то промежуточной сущности хранить все аргументы и собственно процедуру вычисления. В вашем коде ничего такого нет.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Отредактировано 08.04.2015 17:29 VTT . Предыдущая версия .
Re[3]: Ленивый вызов
От: uzhas Ниоткуда  
Дата: 08.04.15 17:31
Оценка: 1 (1) +1
Здравствуйте, swingus, Вы писали:

S>undefined behaviour


я бы начал отсюда: http://rsdn.ru/forum/cpp/5746195.flat
Автор: flаt
Дата: 18.08.14
Re[2]: Ленивый вызов
От: Evgeny.Panasyuk Россия  
Дата: 08.04.15 17:34
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Лучше поясните, что вы имеете ввиду под "ленивый".

VTT>Вообще ленивость (lazy evaluation) подразумевает разнесение по времени инициализации вычисления и собственно вычисления, которое начнет выполняться только когда (и если) кому-нибудь понадобится его результат. Т.е. надо в какой-то промежуточной сущности хранить все аргументы и собственно процедуру вычисления. В вашем коде ничего такого нет.

В контексте шаблонов есть другая ленивость — отложенное инстанцирование. Например lazy_enable_if.
Re[4]: Ленивый вызов
От: swingus  
Дата: 08.04.15 18:06
Оценка:
Кажется, то, что надо. Спасибо.

Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, swingus, Вы писали:


S>>undefined behaviour


U>я бы начал отсюда: http://rsdn.ru/forum/cpp/5746195.flat
Автор: flаt
Дата: 18.08.14
Re: Ленивый вызов
От: Mr.Delphist  
Дата: 08.04.15 18:43
Оценка:
Здравствуйте, swingus, Вы писали:

S>Этот код не скомпилируется, так как у методов exec() для разных структур не совпадают сигнатуры. Вопрос, можно ли сделать ленивый вызов метода?


Верно ли я понимаю, что Вы хотите что-то типа SFINAE? Т.е. совпала сигнатура — позвали метод? Не совпала — пляшем дальше?
Re[2]: Ленивый вызов
От: swingus  
Дата: 08.04.15 19:06
Оценка:
Да, SFINAE с проверкой сигнатуры. Я уже сделал, как посоветовал uzhas, правда, не проверил ещё.

Здравствуйте, Mr.Delphist, Вы писали:

MD>Здравствуйте, swingus, Вы писали:


MD>Верно ли я понимаю, что Вы хотите что-то типа SFINAE? Т.е. совпала сигнатура — позвали метод? Не совпала — пляшем дальше?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.