首页 > 编程语言 >c++参数包展开和折叠表达式

c++参数包展开和折叠表达式

时间:2024-07-12 16:44:47浏览次数:13  
标签:std ... func3Imp get int 折叠 args c++ 表达式

template<typename T>
void fun2(T t)
{

    cout << t << endl;
}

//利用逗号表达式和初始化列表展开
template<typename ...Arg6>
void fun1(Arg6... args)
{
    int arr[] = { (fun2(args),0)... };
}

template<typename T>
int func3Imp(T&& t)
{
    static int c = 0;
    std::cout << t << endl;
    return ++c;
}

template<typename... Ts>
void func3(Ts&&... args)
{
    const int size = sizeof...(args) + 2;
    int res[size] = { 1, args..., 2 };

    //初始化列表展开
    int dummy[sizeof...(Ts)] = { func3Imp(std::forward<Ts>(args))...};
}

template<class... Args>
void fLambda(Args... args)
{
    //注意这里调用func3(args...),属于参数包直接展开为func3的参数
    auto lm = [&, args...] { return func3(args...); };
    lm();
}

template<typename... Ts, int... N>
void print_tuple(const std::tuple<Ts...>& t, std::index_sequence<N...>) {
    int dummy[sizeof...(Ts)] = { func3Imp(std::get<N>(t))... }; // 初始化列表展开,和index_sequence配合使用
    //fLambda(std::get<N>(t)...); //参数包在函数形参中的展开 fLambda(std::get<1>(t),std::get<2>(t),std::get<3>(t))
    //fLambda(func3Imp(std::get<N>(t))...); //fLambda(func3Imp(std::get<1>(t)),func3Imp(std::get<2>(t)),func3Imp(std::get<3>(t)))
   
}
template<typename... Ts, int... N>
void print_tuple2(const std::tuple<Ts...>& t, std::index_sequence<N...>) {
    int dummy[sizeof...(Ts)] = { (func3Imp(std::get<N>(t)),0)... };//利用逗号表达式和初始化列表展开
}

template<typename... Ts, int... N>
void print_tuple3(const std::tuple<Ts...>& t, std::index_sequence<N...>) {
   // ((std::cout << std::get<N>(t) << ' '), ...);      //c++17的折叠表达式
}

//使用
    {
        //auto tuple = std::make_tuple(1, 2.3, "hello");
        auto tuple = std::make_tuple(1, 2, 333);
        print_tuple(tuple, std::make_index_sequence<std::tuple_size_v<decltype(tuple)>>{}); //make_index_sequence的参数必须<=tuple元素数量
        print_tuple2(tuple, std::make_index_sequence<std::tuple_size_v<decltype(tuple)>>{});
        print_tuple3(tuple, std::make_index_sequence<std::tuple_size_v<decltype(tuple)>>{});
    }
    fun1(12, 3, 4);
    func3(12, 13);
    fLambda(11, 12);

参考:https://zh.cppreference.com/w/cpp/language/parameter_pack

标签:std,...,func3Imp,get,int,折叠,args,c++,表达式
From: https://www.cnblogs.com/Cxiangyang/p/18298799

相关文章

  • 在C++中使用gRPC框架
    概览在gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同机器上的服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多RPC系统类似,gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包括参数和返回类型)。在服务器端实现这个接口,并运行一个gRPC......
  • [regex]正则表达式
    1.参考及测试文本正则表达式在线测试工具,选python语言,python字符串前直接加r防止正则表达式被转义github上找的学习资料测试字符串(随便敲的)ThefatcatsatonthematThecarparkedinthegarageAgarageisagoodplacetoparkacargoodplace.Thefatcatsat......
  • C/C++ 避免空指针解引用的方法
    在C/C++中,空指针解引用是一个常见的问题,它会导致程序崩溃或未定义行为。为了避免这种情况,可以采取以下几种方法来确保指针在使用前是有效的:1.初始化指针确保所有指针在使用前都被初始化。未初始化的指针可能包含任意值,尝试解引用这样的指针是危险的。int*ptr=nullptr;......
  • 【C++11新特性】在定义静态成员变量的同时进行初始化
    //test.hclasstest{public:test()=delete;~test()=delete;private:staticconstexprlonglongPOLY_64_REV=0x95AC9329AC4BC9B5L;staticconstexprintBITS_PER_BYTE=8;staticconstexprintCRC_TABLE_LENGTH=256;staticlon......
  • 【C++修行之道】string类的使用
    目录一.C语言中的字符串二、标准库中的string类(了解)2.1string类(了解)2.2帮助文档阅读三、string类的常用接口说明3.1 string类对象的常见构造 3.2 string类对象的容量操作3.3 string类对象的访问及遍历操作字符串类的简单实现3.4 string类对象的修改操作......
  • 2024年华为OD机试真题-传递悄悄话-C++-OD统一考试(C卷D卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄......
  • C++ 多态
    1.多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。2.多态的定义及实现2.1 虚函数虚函数:即被virtu......
  • How to ues Dev C++
    对于Dev-C++这个"老古董",合理利用设置去提升它的能力,是非常important重要的。1.打开全警告方式:工具[T]->编译选项[C]->代码生成/优化->代码警告->第二个和第三个选Yes代码里,总是会出现奇奇怪怪的错误(scanf、printf占位符和参数列表不匹配,if里把==打成=,运算符优先级.........
  • 一些 C++ 的卡常技巧
    是的,这篇文章的主要内容非常好懂,相信各位同学也十分感兴趣毕竟哪位OIer不想自己的代码跑得飞快呢?那么我们就进入正题吧!First众所周知,一份代码里面必然会有很多循环打表的话当我没说,而循环自然是十分占时间的。所以我们要做的就十分清楚了:加速循环!1.把int改成registerin......
  • <c++>斗破苍穹游戏(转载·博客园)喜欢的一键三连~
    #include<stdio.h>#include<ctime>#include<time.h>//suiji#include<windows.h>//SLEEP函数structPlayer//玩家结构体,并初始化player{charname[21];intattack;intdefense;inthealth;longintmax_health;intlevel;intexp;intrange_exp;......