Почему компилятор пишет, что переменная не инициализирована

Рейтинг: 1Ответов: 2Опубликовано: 18.07.2023

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

#include <iostream>
#include <typeinfo>
using namespace std;


inline void boo() {}

template <typename first, typename... other> void boo(first fst, other... Other)
{
    cout << typeid(first).name() << endl;
    boo(Other...);
}

template<typename R,typename ... args>
void foo(R(*ptr)(args... xc))
{   
    boo(xc...);
}


void xf(int a, int b) {}


int main()
{
    foo(xf);
    return 0;
}

Ответы

▲ 3Принят

boo не нужна, типы аргументов уже получены - args, их можно сразу выводить.

#include <iostream>
#include <typeinfo>

template<typename R,typename ... args>
void foo(R(*ptr)(args...))
{   
    ((::std::cout << typeid(args).name() << ' '), ...) << '\n';
}

void xf(int a, int b) {}

int main()
{
    foo(xf);
    return 0;
}

online compiler

▲ 4

R(*ptr)(args... xc) : ptr - это указатель на функцию с типами args. Имя переменных xc игнорируется при указании типа функций. Дополнительный аргумент xc нужно передавать отдельным аргументом в функцию foo.

template <typename first, typename... other>
void boo(first fst, other... Other)
{
    cout << typeid(first).name() << "=" << fst << endl;
    boo(Other...);
}

template<typename R,typename ... args>
void foo(R(*ptr)(args... ),args... xc){
  boo(xc...);
}

int main(){
  foo(xf,1,2);
}