LI.LE
LI.LE

Reputation: 107

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

I am designing an interface that accepts a user-defined function as parameter, which is then executed in a built-in function, like below.

#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);
}

where,

What I want to know is "how to implement the if-else statements" in function 'builtin'?

Upvotes: 0

Views: 462

Answers (1)

Jarod42
Jarod42

Reputation: 217478

With 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);
}

With 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());
}

Upvotes: 5

Related Questions