2012-05-27 5 views
1

В настоящее время я сталкиваюсь с интересной ситуацией с контейнерами STL. У меня есть метод, который должен возвращать различные статические массивы объектов в зависимости от параметра. Указанные объекты имеют тип массива < SomeClass, _ >.C++ 11: возвращение массива

Причина подчеркивания заключается в том, что они не все массивы одинакового размера. Поскольку массив настолько аккуратно завернут, и размеры массивов не изменяются, я надеялся, что вас не заставят преобразовать массивы в векторы, поскольку не только инициализация очень аккуратная прямо сейчас, но я также нахожу массив как точная структура, которую я хочу, и изменение размера будет накладным и избыточным.

Любой шанс, которого я могу достичь, чего хочу? Если нет, есть ли более чистое решение, чем использование векторов?

+4

Ваш вопрос непонятен мне ... Является ли ваш метод какой-то функцией шаблона? Не могли бы вы показать нам какой-то контекст, включив код? –

+0

Считайте, что так же, как 'int [3]', 'std :: array ' имеет свой размер как часть его типа. И данная функция имеет один и только один тип возврата. (Помня о том, что функциональные шаблоны - это не функции, а функции шаблона, которые они «генерируют»). Надеюсь, это поможет вам решить, что использовать. –

ответ

2

Можно ли вычислить размер возвращаемого массива во время компиляции на основе аргументов? Если да, то вы можете использовать шаблоны, чтобы обеспечить правильное значение для _. Например, если возвращение массива имеет ту же длину, как какой-то аргумент массива, то вы могли бы сделать что-то вроде:

template<int N> 
array<SomeClass, N> myFunc(array<Foo, N> someArg); 

Или, если вы всегда будете знать правильный размер возвращаемого массива (во время компиляции) в сайт, где вы называете его, вы можете сделать:

template<int N> 
array<SomeClass, N> myFunc(); 

И называют его:

array<SomeClass, 5> = myFunc<5>(); 

Если нет, то вам, возможно, придется использовать векторы.

+0

Мои массивы статически инициализированы в другом месте, а размер требуемого возвращаемого значения неизвестен на сайте вызова даже во время выполнения, иначе я мог бы использовать что-то грязное, например, вернуть указатель на массив C-стиля. Думаю, я прибегну к векторам – em70

0

У вас всегда есть возможность написать класс array_view<T>, который может служить ссылкой на array<T,N> для любых N.

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