c – 获取可变参数模板可变参数模板参数可变参数
发布时间:2020-12-16 09:48:01 所属栏目:百科 来源:网络整理
导读:是. 假设我有一个包含typedef的简单可变结构: templatetypename... TArgs struct TupleTypeHolder { using TupleType = std::tupleTArgs*...;}; 我想传递TupleTypeHolder something作为另一个类的模板参数,并获取该typedef. 我的所有尝试都没有编译. // Non
是.
假设我有一个包含typedef的简单可变结构: template<typename... TArgs> struct TupleTypeHolder { using TupleType = std::tuple<TArgs*...>; }; 我想传递TupleTypeHolder< something>作为另一个类的模板参数,并获取该typedef. 我的所有尝试都没有编译. // None of these is valid template<template<typename...> class TTupleTypeHolder> struct TupleMaker { using MyTupleType = TTupleTypeHolder::TupleType; // Not valid using MyTupleType = typename TTupleTypeHolder::TupleType; // Not valid }; template<template<typename... A> class TTupleTypeHolder> struct TupleMaker2 { // A is not a valid name here using MyTupleType = TTupleTypeHolder<A...>::TupleType; // Not valid using MyTupleType = typename TTupleTypeHolder<A...>::TupleType; // Not valid }; 有没有办法使用类变量模板类的可变参数模板参数(在本例中为TupleTypeHolder的TArgs …),该类使用上述类作为模板可变参数模板参数? 用法示例: template<typename... TArgs> struct TupleTypeHolder { using TupleType = std::tuple<TArgs*...>; }; template<typename... TArgs> static int getSomeValue() { ... } template<??? T1,??? T2> class TupleMaker { std::pair<int,int> someValues; using TupleType1 = T1::TupleType; using TupleType2 = T2::TupleType; TupleMaker() : someValues{getSomeValue<T1's TArgs...>(),getSomeValue<T2's TArgs...>()} { } }; class MyTupleMaker : TupleMaker<TupleTypeHolder<int,char>,TupleTypeHolder<int,float>> { }; MyTupleMaker::TupleType1 tuple1{new int(1),new char('a')}; MyTupleMaker::TupleType2 tuple1{new int(35),new float(12.f)}; 解决方法
工作用法示例:
#include <tuple> template<typename... TArgs> struct TupleTypeHolder { using TupleType = std::tuple<TArgs*...>; }; template<typename... TArgs> static int getSomeValue() { return 42; } // primary template: template<class T1,class T2> struct TupleMaker; // partial specialization: template<template<class...> class TT1,template<class...> class TT2,class... T1,class... T2> struct TupleMaker < TT1<T1...>,TT2<T2...> > { std::pair<int,int> someValues; using TupleType1 = typename TT1<T1...>::TupleType; using TupleType2 = typename TT2<T2...>::TupleType; TupleMaker() : someValues{getSomeValue<T1...>(),getSomeValue<T2...>()} { } }; struct MyTupleMaker : TupleMaker<TupleTypeHolder<int,new char('a')}; MyTupleMaker::TupleType2 tuple2{new int(35),new float(12.f)}; int main() {} 当您传递类型时,主模板有两种类型. TupleTypeHolder< int,char>是一种类型,一种模板的特化,而不是一种模板本身.然而,模板模板参数将模板作为参数(而不是类型),例如: template<template<class...> class Foo> struct Bar { using type = Foo<int,double,char>; }; Bar< std::tuple > b; // note: no template arguments for `std::tuple`! 通过部分特化,您可以将模板专精分割为模板和参数,这就是上述方法的工作原理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |