2014-01-12 3 views
0

У меня есть ввод массивов различных типов (void**),Thrust кортеж динамического размера

, например, два массива ints и chars, и я хочу сделать массив кортежей из них.

I Количество массивов и их типы неизвестно во время компиляции, поэтому я не могу просто thrust::make_tuple, я могу разбить его на все возможности, но так как я могу иметь 10 типов и 10 массивов, это будет 100 жестко закодированные строки make_tuple.

Я ищу более удобный способ, чтобы сделать это, я попробовал этот простой пример превращения массива в кортеж:

template<typename T> 
thrust::tuple<int, T> makeBiggerTuple(T tuple, int* array, int size) 
{ 
    if (size > 1) 
     return makeBiggerTuple(thrust::make_tuple(*array, tuple), array++, size - 1); 
    return thrust::make_tuple(*array, tuple); 
} 

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

Итак, есть ли способ избежать большого количества жестко привязанных линий для каждого случая?

p.s

Я на самом деле нужен кортеж их итераторы, но это эквивалентный вопрос.

+0

Как вы знаете типы ввода ('void **') во время выполнения? Хотя кортежи набираются во время компиляции, в зависимости от вашего ответа на мой вопрос мы все равно можем найти способ. – Paranaix

+0

I тоже есть Type * извините за отсутствие упоминания. Но я обнаружил, что типы не имеют значения для таких функций, как set_intersect, поэтому все дело в создании динамического кортежа. – Vladp

+0

Это 'Тип **' или 'Тип *' Я немного запутался прямо сейчас – Paranaix

ответ

2

Вы хотите, чтобы std::vector из boost::variant, или ручного эквивалента.

Выполнение того, что вы задали во время компиляции с tuple, приводит к экспоненциальному раздуванию и редко подходит для правильной работы. Хотя я мог писать код, который принимает массивы размером до 10 с до 10 элементами и вызывает функцию с помощью настраиваемого кортежа, полученные 10 миллиардов сгенерированных функций взорвут ваш компилятор: и если вы не хотите, чтобы каждая функция в вашем двоичном быть в 10 миллиардов раз больше, мы должны были бы напечатать стирание результата так или иначе.

Как правило, используйте динамические структуры для динамических данных: мы имеем динамическую длину, поэтому vector, а данные имеют время выполнения, набираемое из конечного набора, поэтому variant.

+0

Я не думал об этом, но будет ли он хорошо работать с итераторами? Можно ли использовать вектор итераторов вместо zip-итератора? – Vladp

+0

@ vladp неоновые итераторы в порядке. Не используйте их случайно. – Yakk