передать функции с другим количеством параметров другой функции C ++ - PullRequest
1 голос
/ 09 ноября 2019

Представьте себе функцию func1, параметрами которой являются функция f и ее аргументы. Пусть есть две функции func2 и func3, которые должны быть переданы в func1 со следующими определениями:

bool func2(int a, int b, float c){
    // does something with arguments and returns the boolean result
}

bool func3(int a, int b, float c, float d){
    // does something with arguments and returns the boolean result
}

Интересно, как мне определить func1, чтобы он мог бытьсовместим с обеими этими функциями. Конечно, есть поворот, и он должен передать фиктивный параметр в func2, но это не очень хорошее решение. Я прочитал этот пост , но это не похоже на совместимое решение. Есть идеи?

Редактировать:

Эта функция представляет собой шаблон C ++, который должен быть эквивалентен функции Python, такой как:

def func1(f, int a, int b, *args):
    if f(a, b, *args):
        # does something

Ответы [ 4 ]

4 голосов
/ 09 ноября 2019

Шаблоны Variadic могут помочь вам. Простейшая версия:

template<class Fn, typename... Ts>
void func1(Fn fn, int a, int b, Ts... args) {
    if (fn(a, b, args...))
        ...
}

func1(func2, 1, 2, 3);
func1(func3, 1, 2, 3, 4);
1 голос
/ 09 ноября 2019

Звучит так, как будто вы хотите шаблон с вариацией. Примерно так должно быть (на мобильном телефоне могут быть ошибки синтаксиса).

template<typename TCallback, typename TArgs...>
void Func1(TCallback Evt, TArgs... Args)
{
    Evt(Args...);
}

void Func2(int Arg1, int Arg2) { }

Func1(Func2, 10, 100);
0 голосов
/ 09 ноября 2019

Я предпочитаю более читаемый код, даже если увеличивается количество строк, которые нужно написать.

Подпись func2 и func3 выглядит более менее похожей. Следовательно, вы можете func2 принять другой параметр по умолчанию, как показано ниже

bool func2(int a, int b, float c, float d = 0){
    // does something with arguments and returns the boolean result
}

bool func3(int a, int b, float c, float d){
    // does something with arguments and returns the boolean result
}

Теперь объявите указатель функции и передайте его func1

bool (*fp) (int a, int b, float c, float d);

void func1(fp *fp1);

Обратите внимание, что C ++ не 't очень нравятся указатели функций

0 голосов
/ 09 ноября 2019

Я не уверен на 100%, но я верю, что вы должны создавать шаблонизированную функцию. Примерно так.

template<typename T>
void func1 (T x, T y) {
    //code
}

Теоретически вы должны иметь возможность заменить x и y на bool из вашей функции или любых других значений. По сути, вы создаете свой собственный тип.

Я привел ссылку ниже. Надеюсь, это поможет.

https://en.cppreference.com/w/cpp/language/function_template

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