Создайте шаблонную функцию для функции, которая принимает указатели функций в качестве параметров для многих типов функций.

У меня есть несколько функций c, которые делают почти то же самое, за исключением функций в одной строке. Я хочу заменить все эти функции одной функцией, которую я могу передать как указатель функции для этой одной строки:

Func1(type parameter);

Func2(type1 parameter1,type2 parameter2);

FuncFunc(FunctionPointer functionPointer){
    funcVar;
    ...
    functionPointer(funcVar,....);
    ...
}

int main(){
    FuncFunc(Func1);

    FuncFunc(Func2(,type2Object));
}

Могу ли я сделать это на С++?


person ClemsonCoder    schedule 18.08.2016    source источник
comment
Это, безусловно, можно сделать на C++. Однако ваш вопрос несколько не ясен. несколько функций c, которые делают почти одно и то же, за исключением функций в одной строке - это совершенно неразборчиво. Можете ли вы экстраполировать и привести пример.   -  person Sam Varshavchik    schedule 18.08.2016


Ответы (1)


Непонятно, чего вы пытаетесь достичь, но вот пример того, как ваш код можно перевести на действительный C++. Во-первых, давайте определим ваш Func с максимальным количеством аргументов:

template<typename T1, typename T2>
void Func(T1 par1, T2 par2) {
        std::cout << par1 << " " << par2 << std::endl;
}

Затем мы должны заставить FuncFunc принимать любую функцию, которую вы хотите:

template<typename ...T>
void FuncFunc(const std::function<void(T...)>& fPtr) {
        std::string funcVar = "Foo!";
        fPtr(funcVar);
}

или более простой в использовании вариант:

template<typename F>
void GuncFunc(const F& fPtr) {
        std::string funcVar = "Foo!";
        fPtr(funcVar);
}

и, наконец, используйте FuncFunc:

auto Func1 = std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1);
auto Func2 = std::bind(Func<std::string, int>, std::placeholders::_1, 42);
FuncFunc(std::function<void(std::string)>(Func1));
FuncFunc(std::function<void(std::string)>(Func2));
return 0;

or GuncFunc:

// Using std::bind
GuncFunc(std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1));
GuncFunc(std::bind(Func<std::string, int>, std::placeholders::_1, 42));

// Or using lambdas:
GuncFunc([](std::string s){Func<float, std::string>(3.14f, s);});
GuncFunc([](std::string s){Func<std::string, int>(s, 42);});

Выбор std::bind или lambdas, похоже, выходит за рамки вашего вопроса, но вы можете найти что-то полезное здесь, здесь или в этот вопрос.

В любом случае, скорее всего, вам понадобятся лямбды, std::function, std::bind или вариативные шаблоны.

person Sergey    schedule 18.08.2016
comment
Вы также можете использовать (и, вероятно, должны предпочесть) лямбды вместо std::bind - person qxz; 18.08.2016