如何根据 C++ 中可变大小的模板模板列表获取元组?
How to get a tuple based on list of template templates of variable size in C++?
我创建了一个模板 class,它采用两个普通模板参数(如 int 或 double),并从中派生出其他几个 classes:
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> {...}
我需要设计一个结构,允许编译器根据模板类型列表及其参数(上面代码片段中的 B 类型)构建 std::tuple。
所以给出下面的列表
Derived1Class<int>, Derived1Class<double>, Derived2Class<bool>, Derived2Class<std::string>
编译器应该推断出以下元组:
std::tuple<int, double, bool, std::string>
这是否可能,如果可能,如何在 C++ 中完成?
提前致谢)
Is this even possible, and if so, how it can be done in 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;
}
我创建了一个模板 class,它采用两个普通模板参数(如 int 或 double),并从中派生出其他几个 classes:
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> {...}
我需要设计一个结构,允许编译器根据模板类型列表及其参数(上面代码片段中的 B 类型)构建 std::tuple。
所以给出下面的列表
Derived1Class<int>, Derived1Class<double>, Derived2Class<bool>, Derived2Class<std::string>
编译器应该推断出以下元组:
std::tuple<int, double, bool, std::string>
这是否可能,如果可能,如何在 C++ 中完成?
提前致谢)
Is this even possible, and if so, how it can be done in 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;
}