如何在 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' 接受用户定义的函数,并通过检测给定函数的参数列表来传递参数 'userdef'。
- 另外两个函数 'userdef1' 和 '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());
}
我正在设计一个接口,它接受用户定义的函数作为参数,然后在内置函数中执行,如下所示。
#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' 接受用户定义的函数,并通过检测给定函数的参数列表来传递参数 'userdef'。
- 另外两个函数 'userdef1' 和 '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());
}