2016-11-24 2 views
8

Очевидно, что код ниже не компилируется в C++. Но у меня есть случай, когда я хочу параметризовать класс с нулевым или большим количеством элементов данных на основе параметров шаблона.Объявить переменные-члены из параметра вариационного шаблона

Есть ли способ объявить класс, члены которого зависят от параметров вариационного шаблона, чтобы я мог получить доступ к каждому из них? или каким-то другим способом добиться того, что я хотел бы?

Это появилось в реальной программе, которую я решил совершенно по-другому, но теперь меня интересует более абстрактная проблема, как я мог это сделать.

template <typename... Types> class Data 
{ 
    // Declare a variable of each type in the parameter pack 
    // This is NOT valid C++ and won't compile... 
    Types... items; 
}; 

struct Item1 
{ 
    int a; 
}; 

struct Item2 
{ 
    float x, y, z; 
}; 

struct Item3 
{ 
    std::string name; 
} 

int main() 
{ 
    Data<Item1, Item2> data1; 
    Data<Item3> data2; 
} 
+1

Удивительно, но это не представляется дубликатом. – MSalters

ответ

6

Вы можете использовать std::tuple

#include <tuple> 

template <typename... Types> class Data 
{ 
    std::tuple<Types...> items; 
}; 

struct Item1 
{ 
    int a; 
}; 

struct Item2 
{ 
    float x, y, z; 
}; 

struct Item3 
{ 
    std::string name; 
}; 

int main() 
{ 
    Data<Item1, Item2> data1; 
    Data<Item3> data2; 
} 

Попробуйте here

+0

Спасибо, это здорово. Я использую кортеж, но почему-то мне не приходило в голову, что я могу использовать его с расширенным пакетом параметров. – jcoder

6

В стандарте вы попали. Просто объявите std::tuple<Types...> items.

7

То есть цель std::tuple:

template <typename... Types> class Data 
{ 
    std::tuple<Types...> items; 
}; 
+0

Ах спасибо. Это немного неловко, я использую кортеж, но почему-то не думал использовать его с расширением пакета параметров здесь. – jcoder

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