Как передать шаблон лямбда в функцию и использовать его с разными типами - PullRequest
0 голосов
/ 08 января 2019

У меня этот код унаследован от старого времени C ++ с использованием макросов. В настоящее время я заменяю его, и я нахожусь в точке, где необходимо учитывать некоторые конструкции.

Как правило, у меня есть это:

if(condition)
{
    fun1(fun2(arguments, arg1)); // let's say arg1 is a vector of doubles
}
else
{
    fun1(fun2(arguments, arg2)); // let's say arg2 is a double
}

несколько раз. fun1() имеет различный набор аргументов в зависимости от fun2() типов аргументов, и я мог бы также иметь там arg1 и arg2 (истинный код на самом деле имеет несколько слоев if с, каждый раз с другим набором типов, несколько дополнительных слоев функций внутри каждой ветви).

Я бы хотел выделить это в функцию, которая может принимать лямбда-шаблон, например:

[&](auto arg) { fun1(fun2(arguments, arg));}

Теперь проблема в том, что это шаблонно, поэтому я не могу превратить его в std::function, поэтому я не знаю, какой аргумент мне следует использовать для создания моей функции:

void dispatch(bool condition, const std::vector<double>& arg1, double arg2, ???? lambda)
{
    if(condition)
    {
        lambda(arg1);
    }
    else
    {
        lambda(arg2);
    }
}

Есть ли такая опция в C ++ 17? или даже C ++ 20?

1 Ответ

0 голосов
/ 08 января 2019

Теперь проблема в том, что это шаблонно, поэтому я не могу превратить его в std::function, поэтому я не знаю, какой аргумент мне следует использовать для создания моей функции

А как же просто так?

template <typename F>
void dispatch(bool condition, const std::vector<double>& arg1, double arg2, F lambda)

Я имею в виду ... вы можете видеть лямбда-функцию почти как синтаксический сахар для объекта класса с operator() (шаблон operator() в случае универсальный лямбда).

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

Возможно, вы можете принять его как постоянную ссылку (F const & lambda), если lambda не является изменяемым, чтобы избежать ненужных копий.

Есть ли такая опция в C ++ 17? или даже C ++ 20?

Должно работать, начиная с C ++ 14. До C ++ 14 универсальная лямбда была недоступна (но вы можете заменить их явными классами с шаблоном operator() s).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...