Reputation: 107
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
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