如何在 C++ 中检测函数的参数列表?

How to detect argument list of a function in C++?

我正在设计一个接口,它接受用户定义的函数作为参数,然后在内置函数中执行,如下所示。

#include <stdio.h>
#include <vector>
using namespace std;

template <class USERDEF>
void builtin(USERDEF userdef){
    std::vector<int> vec = {1, 2, 3};
    if("parameter list is (vector<int>&)") 
        userdef(vec);
    else if("parameter list is (vector<int>::iterator, vector<int>::iterator)") 
        userdef(vec.begin(), vec.end());
    else 
        exit(-1);
}

void userdef1(vector<int> &vec){
    for(auto it=vec.begin(); it!=vec.end(); it++)
        printf("%d ", *it);
    printf("\n");
}

void userdef2(vector<int>::iterator begin, vector<int>::iterator end){
    for(auto it=begin; it!=end; it++)
        printf("%d ", *it);
    printf("\n");
}

int main(){
    builtin(userdef1);
    builtin(userdef2);
}

其中,

我想知道的是函数 'builtin'?

中的“如何实现 if-else 语句”

if constexpr:

template <class F>
void builtin(F func){
    std::vector<int> vec = {1, 2, 3};

    if constexpr(std::is_invocable_v<F, std::vector<int>&>) {
        func(vec);
    } else if constexpr (std::is_invocable_v<F, std::vector<int>::iterator, std::vector<int>::iterator>) 
        func(vec.begin(), vec.end());
    else 
        exit(-1);
}

与 SFINAE:

template <class F, std::enable_if_t<std::is_invocable_v<F, std::vector<int>&>, int> = 0>
void builtin(F func)
{
    std::vector<int> vec = {1, 2, 3};
    func(vec);
}

template <class F, std::enable_if_t<std::is_invocable_v<F, std::vector<int>::iterator, std::vector<int>::iterator>, int> = 0>
void builtin(F func)
{
    std::vector<int> vec = {1, 2, 3};
    func(vec.begin(), vec.end());
}