背景:
看到了一个c++大佬的一个可变参数的函数调用,有点神奇,所以在它的基础上加了些自己的改动
代码
#include <iostream>
#include <functional>
#include <thread>
#include <format>
#include <numeric>
#include <tuple>
template<typename ...T, typename C>
void call(std::tuple<T...>&_tup, C (*f)(T...))
{
[&] <class TupType, size_t ...I>(const TupType &_tup, std::index_sequence<I...>){
f(std::get<I>(_tup)...);
}(_tup, std::make_index_sequence<sizeof...(T)>());
}
template<typename C, typename ...T >
void call1(C (*f)(T...), T ...args)
{
//std::tuple<T...> _tup = {args...};//tuple 构造方法
//std::tuple<T...> _tup {args...};//一致性初始化列表
std::tuple<T...> _tup =std::make_tuple(args...);//make_tuple构造
[&] <class TupType, size_t ...I>(const TupType &_tup, std::index_sequence<I...>){
f(std::get<I>(_tup)...);
}(_tup, std::make_index_sequence<sizeof...(T)>());
}
template<typename C, typename ...T >
void call2(C (*f)(T...), T ...args)
{
f(args...);
}
void f(int a, double b, char c, int d)
{
std::cout<<a<<b<<c<<d<<std::endl;
}
int main()
{
std::tuple<int,double, char,int> t(1, 1.2, '*', 10);
call(t, f);
call1(f, 1,1.2,'*',10);
call2(f, 1,1.2,'*',10);
std::invoke(f, 1,1.2,'*',10);
分析:
call1 是我参照上边的写的,主要把tuple拆成了可变参数,这样调用的时候,传递函数指针与对应的参数,跟std::invoke 比较类似. call2就更简单了,直接调用