终于见到了 c++通过尖括号的模板传递参数的例子了,还是 c++11 中的标准数据结构 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
northisland
V2EX    分享发现

终于见到了 c++通过尖括号的模板传递参数的例子了,还是 c++11 中的标准数据结构

  •  
  •   northisland 2017-07-20 17:22:09 +08:00 4080 次点击
    这是一个创建于 3055 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #include <tuple> #include <iostream> #include <string> #include <stdexcept> std::tuple<double, char, std::string> get_student(int id) { if (id == 0) return std::make_tuple(3.8, 'A', "Lisa Simpson"); if (id == 1) return std::make_tuple(2.9, 'C', "Milhouse Van Houten"); if (id == 2) return std::make_tuple(1.7, 'D', "Ralph Wiggum"); throw std::invalid_argument("id"); } int main() { auto student0 = get_student(0); std::cout << "ID: 0, " << "GPA: " << std::get<0>(student0) << ", " << "grade: " << std::get<1>(student0) << ", " << "name: " << std::get<2>(student0) << '\n'; double gpa1; char grade1; std::string name1; std::tie(gpa1, grade1, name1) = get_student(1); std::cout << "ID: 1, " << "GPA: " << gpa1 << ", " << "grade: " << grade1 << ", " << "name: " << name1 << '\n'; } 

    玩的是 c++的元组=_=,参数竟然能通过尖括号来传递=_=

    std::get<0>(student0)

    template< std::size_t I, class... Types > typename std::tuple_element<I, tuple<Types...> >::type& get( tuple<Types...>& t ) noexcept; 

    感觉非常酷

    10 条回复    2017-08-09 18:12:34 +08:00
    lrxiao
        1
    lrxiao  
       2017-07-20 21:46:55 +08:00   1
    non-type template parameter

    需要编译期常量(而且基本限定为 integer literal )
    lrxiao
        2
    lrxiao  
       2017-07-20 21:49:07 +08:00   1
    用 lvalue reference 的做 non-type 的...我是没见过..
    codehz
        3
    codehz  
       2017-07-20 22:25:49 +08:00   1
    这就觉得酷啦。。你是没看过那些疯狂用模板元编程的。。。
    feelapi
        4
    feelapi  
       2017-07-20 22:31:44 +08:00   1
    github.com/steemit/steem, 看吧,vs2015 编译不过,/Zm2000 都不行。GCC5.2,Debian 下编译通过,boost 用的登峰造极。
    northisland
        5
    northisland  
    OP
       2017-07-21 08:39:53 +08:00
    @codehz C++两大疯狂帮派:宏派,模板派
    codehz
        6
    codehz  
       2017-07-21 13:29:31 +08:00
    事实上,对于 C++元组而言,用模板参数传递取的值几乎是唯一正确的做法毕竟,你要保证类型系统的正常工作,就必须把取值的位置在编译期确定下来。。。
    Phoinikas
        7
    Phoinikas  
       2017-07-21 20:15:45 +08:00
    编译期通过参数取值,有什么比较实用的场景吗
    感觉要实用就会陷入模板元编程的深坑。。。
    codehz
        8
    codehz  
       2017-07-21 21:55:11 +08:00
    @Phoinikas 因为 C++是强类型的语言,元祖不同位置的类型可以是不同的。。。所以位置必须是编译期常量,所以就是模板参数咯
    很多时候用模板都是为了类型系统的完备性。。。
    gnaggnoyil
        9
    gnaggnoyil  
       2017-07-29 16:14:30 +08:00
    @Phoinikas C++17 的 structured binding
    crazyneo
        10
    crazyneo  
       2017-08-09 18:12:34 +08:00
    严格来说,在尖括号里直接写 const_expr 传递参数的做法从 c++98 就可以这么干了,v2ex 里研究过 meta-programming 的估计不在少数 boost 的影响还是非常巨大的,早点版本的 tr 库几乎都进了 stl。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1012 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 23:26 PVG 07:26 LAX 15:26 JFK 18:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86