2016-03-18 2 views
1

Рассмотрим этот код:C++ массив различных общих типов

template<typename T> 
void doSomething(std::vector<T> arr) { 
    for (auto i = 0; i < arr.size(); ++i) 
     std::cout << arr[i] << std::endl; 
} 

int main() 
{ 
    doSomething(std::vector<int> { 1, 5, 7 }); 
} 

В этом примере шаблон используется довольно регулярно. Массив из трех целых чисел передается в функцию, которая имеет параметр массива типа T, общие типы. Затем указывается, что они относятся к типу int: std::vector<int> { 1, 5, 7 }.

Что я хотел бы сделать, это инициализировать std::vector, чтобы он содержал три разных типа. Что-то вроде этого:

doSomething(std::vector<T> { 1, "Hi", 2.7f }); 

Здесь нет указанного типа, а std::vector содержит не только целые числа. Есть ли способ сделать такое? Благодаря!

+0

(я думаю) Вы могли бы подделать это с помощью множества классов, но это был бы ужасный код. – Amit

ответ

4

Это невозможно сделать с помощью std::vector. Аргумент шаблона уникален.

Проверьте std::tuple, который может делать то, что вы хотите.

std::tuple<int, std::string, float> 

Если вам нужно больше типичность вам придется сделать что-то вроде этого:

template<typename U, typename V, typename W> 
void doSomething(std::tuple<U,V,W> t) { ... } 

Если вы хотите, кортеж с произвольным числом элементов, вы должны использовать VARIADIC шаблоны затем:

template<typename... Ts> 
void doSomething(std::tuple<Ts...> data) { 
    // ... 
} 
+0

Как упоминалось в шаблонах Guillaume variadic, ответьте на ваш вопрос, но я пока не рекомендую вам это делать. См. [Std :: tuple foreach implementation] (https://codereview.stackexchange.com/questions/51407/stdtuple-foreach-implementation) для итерации через них. – coincoin

0

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

Другие языки, такие как Perl, Python, Javascript и другие, динамически типизируются. Тип объекта определяется во время выполнения, поэтому эквивалентная конструкция массива на языках с динамическим вводом может иметь значения разных типов.

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