2016-11-13 1 views
2

Я создал класс шаблона, который принимает два простых параметров шаблона (например, междунар или двойной) и получен несколько других классов из него:Как получить кортеж на основе шаблонов шаблонов с переменным размером в C++?

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> {...} 

Мне нужно разработать структуру, которая позволила бы компилятору построить зЬй :: tuple на основе списка типов шаблонов и их параметров (тип B в фрагменте кода выше).

Так дали список ниже

Derived1Class<int>, Derived1Class<double>, Derived2Class<bool>, Derived2Class<std::string> 

компилятор должен вывести следующий кортеж:

std::tuple<int, double, bool, std::string> 

Это возможно даже, и если да, то как это может быть сделано в C++?

Заранее спасибо)

ответ

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; 
} 
+0

Честно говоря, даже если это может работать, код довольно нечитаемым, и трудно понять, я думаю, что это следует избегать: D – Cristy

+0

Если вы думаете, что нечитаемым, выбрать любой заголовок, ',' ', и попробуйте прочитать его сами. Никто никогда не обвинял C++ в том, что он кристально чист. Поскольку тег 'C++' на stackoverflow.com является свидетелем ... –

+0

Да, возможно, я просто не использую то, как беспорядочный синтаксис C++ может получить: D – Cristy

Смежные вопросы