2017-01-21 3 views
2

Недавно я подумал о проблеме. Скажем, есть VARIADIC шаблон, как это:Изменение количества определений в классе вариационных шаблонов

template <typename... Types> 
class example 
{ 
    //something 
}; 

Теперь то, что я хочу добиться того, что когда я создаю объект example<int, double, float>, этот экземпляр шаблона будет скомпилирован:

class example<int, double, float> 
{ 
    int int_array[5]; 
    double double_array[5]; 
    float float_array[5]; 
} 

И когда Я создаю объект example<char, long, myClass2, myClass3>, будет создан этот экземпляр шаблона класса:

class example<char, long, myClass2, myClass3> 
{ 
    char char_array[5]; 
    long long_array[5]; 
    myClass2 myClass2_array[5]; 
    myClass3 myClass3_array[5]; 
} 

Так в основном, для каждого VARIADIC списка стемов параметры пластины, повторите действие для каждого переданного имени типа. В моем примере я объявил 5-элементный массив для каждого типа, переданного в вариационный шаблон. Имена не обязательно должны быть «type_array», это может быть что угодно, если я могу сделать действие (например, объявление переменной) для каждого переданного типа.

Возможно ли это?

ответ

5

Ну ... Я полагаю, вы можете использовать наследование

#include <string> 
#include <iostream> 

template <typename T> 
struct wrp 
{ T a[5]; }; 

template <typename ... Ts> 
struct example : public wrp<Ts>... 
{ }; 

int main() 
{ 
    example <int, float, std::string> e0; 

    e0.wrp<int>::a[0] = 1; 
    e0.wrp<float>::a[0] = 1.1f; 
    e0.wrp<std::string>::a[0] = "1.11"; 

    std::cout << e0.wrp<int>::a[0] << std::endl;   // print 1 
    std::cout << e0.wrp<float>::a[0] << std::endl;  // print 1.1 
    std::cout << e0.wrp<std::string>::a[0] << std::endl; // print 1.11 
} 
+0

ли вы проверить код, он работает? (У меня сейчас нет компилятора/идеала, и мне любопытно) – KKZiomek

+0

@KKZiomek - изменил пример добавления трех отпечатков и, да, скомпилировал и работает; с g ++ (4.9.2) и с clang ++ (3.5) – max66

+0

Спасибо, это именно то, что я искал! – KKZiomek

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