c++ - 获取可变参数模板可变参数模板参数可变参数

标签 c++ templates c++11 variadic-templates template-templates

是的。

假设我有一个包含 typedef 的简单可变参数结构:

template<typename... TArgs> struct TupleTypeHolder {
    using TupleType = std::tuple<TArgs*...>;
};

我想通过TupleTypeHolder<something>作为另一个类的模板参数,并获取该类型定义。

我的所有尝试都无法编译。

// 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
};

有没有办法从使用上述类作为模板可变模板参数的类中使用可变模板类的可变模板参数(在本例中为 TupleTypeHolderTArgs...)?


使用示例:

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, char>, 
                                TupleTypeHolder<int, float>> 
{ };

MyTupleMaker::TupleType1 tuple1{new int(1), new char('a')};  
MyTupleMaker::TupleType2 tuple2{new int(35), new float(12.f)};  

int main() {}

当您传递类型时,主模板采用两种类型。 TupleTypeHolder<int, char>是一种类型,是模板的特化,而不是模板本身。 Template template-parameters 但是将 templates 作为参数(而不是类型),例如:

template<template<class...> class Foo>
struct Bar
{
    using type = Foo<int, double, char>;
};

Bar< std::tuple > b; // note: no template arguments for `std::tuple`!

通过部分特化,您可以将模板特化拆分为模板和参数,这就是上面的工作方式。

关于c++ - 获取可变参数模板可变参数模板参数可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19298425/

相关文章:

c++ - 使用 MySQL C++ Connector 解析 undefined reference

c++ - 获取模板类型的基类型(删除 const/reference/等)

templates - 使用可变参数模板建立索引

c++ - 在不分配新内存的情况下使用指针调用重载

c++ - 在 Makefile 中重命名生成的文件

C++无限和代码挂了?冷冻?我不知道

c++ - this 指针从虚成员函数传递给模板

templates - Mandrill 模板中的条件内容

c++ - select() 系统调用和 bash 转义

c++ - 从函数返回一个不可变的 POD 类