2016-11-13 7 views
2

私は(intやダブルなど)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> {...} 

私は、コンパイラは、STDを構築できるようになる構造を設計する必要がありますテンプレート型とそのパラメータのリスト(上記のコードスニペットのB型)に基づいたタプル。

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

がこのさえ可能であり、もしそうなら、どのようにそれはC++で行うことができます

だから、次のタプルを推測する必要があり

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

コンパイラ以下のリストを与えられましたか?事前に

おかげで)

答えて

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

関連する問題