2016-11-13 15 views
2

我已經創建了一個模板類這需要兩個滑動模板參數(如int或雙),並從它派生的其它幾類:如何根據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> {...} 

我需要設計這將允許編譯器來構建一個std的結構::基於模板類型及其參數列表的元組(上面代碼片段中的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++是透明的。由於stackoverflow.com上的'C++'標記是... –

+0

的見證是的,可能我只是不習慣C++語法的混亂程度如何:D – Cristy

相關問題