Здравствуйте, swingus, Вы писали:
S>Этот код не скомпилируется, так как у методов exec() для разных структур не совпадают сигнатуры. Вопрос, можно ли сделать ленивый вызов метода?
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() для разных структур не совпадают сигнатуры. Вопрос, можно ли сделать ленивый вызов метода?
Здравствуйте, swingus, Вы писали:
S>Этот код не скомпилируется, так как у методов exec() для разных структур не совпадают сигнатуры. Вопрос, можно ли сделать ленивый вызов метода?
Лучше поясните, что вы имеете ввиду под "ленивый".
Вообще ленивость (lazy evaluation) подразумевает разнесение по времени инициализации вычисления и собственно вычисления, которое начнет выполняться только когда (и если) кому-нибудь понадобится его результат. Т.е. надо в какой-то промежуточной сущности хранить все аргументы и собственно процедуру вычисления. В вашем коде ничего такого нет.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, VTT, Вы писали:
VTT>Лучше поясните, что вы имеете ввиду под "ленивый". VTT>Вообще ленивость (lazy evaluation) подразумевает разнесение по времени инициализации вычисления и собственно вычисления, которое начнет выполняться только когда (и если) кому-нибудь понадобится его результат. Т.е. надо в какой-то промежуточной сущности хранить все аргументы и собственно процедуру вычисления. В вашем коде ничего такого нет.
В контексте шаблонов есть другая ленивость — отложенное инстанцирование. Например lazy_enable_if.
Здравствуйте, swingus, Вы писали:
S>Этот код не скомпилируется, так как у методов exec() для разных структур не совпадают сигнатуры. Вопрос, можно ли сделать ленивый вызов метода?
Верно ли я понимаю, что Вы хотите что-то типа SFINAE? Т.е. совпала сигнатура — позвали метод? Не совпала — пляшем дальше?
Да, SFINAE с проверкой сигнатуры. Я уже сделал, как посоветовал uzhas, правда, не проверил ещё.
Здравствуйте, Mr.Delphist, Вы писали:
MD>Здравствуйте, swingus, Вы писали:
MD>Верно ли я понимаю, что Вы хотите что-то типа SFINAE? Т.е. совпала сигнатура — позвали метод? Не совпала — пляшем дальше?