2015-04-29 6 views
0

Я хочу вызвать метод (шаблон), который принимает vector<array<T, N>>& с результатом другого метода, который возвращает vector<T>Эффективный способ преобразования/переосмысливать вектор <T> как вектор <array<T, 1>>

Есть ли эффективный (O (1)) способ переосмыслить vector<T> как vector<array<T,1>>? Возможно ли/безопасно до reinterpret_cast?

+0

@timrau не оба контейнера, как предполагается, хранить элементы смежно? – user463035818

+0

@timrau Уверен, что у вас к нему нет доступа? imho базовый вектор :: массив данных должен быть непрерывным куском памяти размерной емкости * sizeof (T) байтов в любом случае. Или я чего-то не хватает? –

+2

@ b.buchhold К сожалению, 'std :: array' не гарантированно не имеет чего-то в конце своих данных. Поэтому элементы массива или вектора 'std :: array' не должны быть смежными. Они будут в одном блоке, но могут быть пробелы. – juanchopanza

ответ

0

Если T на самом деле std::array<U,1> Вы должны быть в состоянии сделать это с помощью шаблона дедукции и перегрузки:

template <typename T> 
std::vector<T> myFunc() 
{ return {T{1}}; } 

template <typename T> 
void myOtherFunc(std::vector<T>) 
{ cout << "not an array\n"; } 

template <typename T, size_t N> 
void myOtherFunc(std::vector<std::array<T,N>>) 
{ cout << "an array\n"; } 

Тогда называя это так:

myOtherFunc(myFunc<int>()); //prints "not an array" 
myOtherFunc(myFunc<std::array<int,1>>()); //prints "an array"