如何根据C++中可变大小的模板模板列表获取元组?

sen*_*enx 2 c++ stl tuples generic-programming variadic-templates

我创建了一个模板类,它接受两个普通的模板参数(如int或double),并从中派生了几个其他类:

template <typename A, typename B>
class IClassBase {...}

template <typename B>
class Derived1Class : public IClassBase<std::string, B> {...}

template <typename B>
class Derived2Class : public IClassBase<std::string, B> {...}
Run Code Online (Sandbox Code Playgroud)

我需要设计一个结构,允许编译器根据模板类型及其参数列表构建一个std :: tuple(上面代码片段中的B类型).

所以给出下面的列表

Derived1Class<int>, Derived1Class<double>, Derived2Class<bool>, Derived2Class<std::string>
Run Code Online (Sandbox Code Playgroud)

编译器应该推断出以下元组:

std::tuple<int, double, bool, std::string>
Run Code Online (Sandbox Code Playgroud)

这是否可能,如果是这样,如何在C++中完成?

提前致谢)

Sam*_*hik 5

这是否可能,如果是这样,如何在C++中完成?

在C++中一切皆有可能.特别是当前的C++标准.用gcc 6.2测试.

#include <tuple>
#include <string>

template<typename template_type> class extract_param;

template<template<typename T> typename template_param, typename template_param_t>
class extract_param<template_param<template_param_t>> {

public:
    typedef template_param_t type_t;
};

template<typename ...Args>
using extract_tuple=std::tuple<typename extract_param<Args>::type_t...>;


template<typename T> class sometemplate {};

int main()
{
    extract_tuple< sometemplate<int>, sometemplate<std::string>> tuple;

    int &intref=std::get<0>(tuple);
    std::string &stringref=std::get<1>(tuple);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 记住我的话.经过20年的黑客攻击C++,上面的代码应该像诗一样读给你. (2认同)