Передача функции в параметры другой функции

void pr1(int a)
{
    std::cout<<"A: " << a;
}

void pr2(int a, int b)
{
    std::cout<<"A: " << a << "B: " << b;
}

void pr3(std::string s)
{
    std::cout<<s;
}

void print(/*Указатель на функцию и ее параметры*/)
{
    
}

Как можно в print передать для вызова какую-либо функцию? А так же все параметры, которая принимает сама функция. Как это можно сделать в стиле C, без использования, например, std::function

int main(int argc, const char * argv[]) {
  
    print(/*Параметры и указатель на функцию*/);
    
    return 0;
}

Ответы (1 шт):

Автор решения: LShadow77

Не знаю точно, что именно требуется от вашей функции print(), по-этому привожу два варианта:

#include <stdio.h>
#include <iostream>

//Вариант 1
template <typename TRet, typename... TArgs>
TRet print1(TRet (*pFunc)(TArgs...), TArgs... args)
{
    return pFunc(args...);
}

//Вариант 2
template <typename TRet, typename... TArgs>
TRet print2(TRet (*pFunc)(TArgs...), const char* pcszFmt, TArgs... args)
{
    printf(pcszFmt, args...);
    return pFunc(args...);
}

//собственно функция, указатель которой передаём в print()
void pr2(int a, int b)
{
    std::cout<<"A: " << a << ", B: " << b << std::endl;
} 


int main()
{
    std::cout << "Variant 1:" << std::endl;
    print1(pr2, 12, 7);
    std::cout << "-------------------------" << std::endl << std::endl;

    std::cout << "Variant 2:" << std::endl;
    print2(pr2, "Arguments: a==%d, b==%d ---> function output: ", 12, 7);
    std::cout << "-------------------------" << std::endl << std::endl;

    return 0;
}

Будет выведено:

Variant 1:
A: 12, B: 7
-------------------------

Variant 2:
Arguments: a==12, b==7 ---> function output: A: 12, B: 7
-------------------------

P.S. Замечу, что в функцию print2() следует передавать простые типы, такие как int, char* и пр. Например, std::string тут не покатит, т.к. printf() такое не понимает.

→ Ссылка