2016-07-18 3 views
0

Это описание Vector of pairs with generic vector and pair type, template of template.Stxxl Vector as dropin replacement for std :: vector

Я хотел был бы иметь возможность вызвать метод с std::vector или stxxl:vector, в то время как аргументы шаблона vector (Пара x, y) указаны.

В частности, метод signatrue может выглядеть следующим образом:

template<typename t_x, typename t_y, 
      template<typename, typename> class t_pair, 
      template<typename...> class t_vector> 
    method(t_vector<t_pair<t_x,t_y>> &v) 

К сожалению, при указании подписи, как это, это не представляется возможным пропускать stxxl:vector в t_vector. Это приводит к следующей ошибке компиляции:

sad.hpp:128:5: note: template argument deduction/substitution failed: 
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’ 
     method(coordinates); 
         ^
program.cpp:104:52: error: expected a type, got ‘4u’ 
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’ 
program.cpp:104:52: error: expected a type, got ‘2097152u’ 

Вопрос заключается в том, как изменить сигнатуру методы для того, чтобы иметь возможность использовать stxxl::vector как дроп-ин для замены существующего кода с использованием std::vector?

Обновление о том, почему я использую вложенные шаблоны для вектора: Возможно, я ошибаюсь, но мне бы хотелось, чтобы компилятор задавал переменные в вышеупомянутом методе.

Я, например, строящему vector или queue

std::vector<t_x> intervals(k * k + 1); 
typedef std::tuple<std::pair<t_x,t_y>,std::pair<t_x,t_y>, std::pair<t_x,t_y>, uint> t_queue; 
std::queue <t_queue> queue; 

Какой должна быть либо uint32_t or uint64_t в зависимости от типа кастрированный баран из пары-элементов uint32_t or uint64_t

+0

Зачем вам нужно указывать параметры шаблона? Почему бы просто не использовать простое 'typename t_vector' без всех остальных параметров? Наличие параметра шаблона шаблона полезно, если вы собираетесь использовать этот параметр шаблона для построения различного типа, но в вашем случае вы используете его только с одним типом, который является 't_pair'. – Holt

+0

Я использую uint32_t и uint64_t как параметр шаблона пары. Поэтому я использую t_x/t_y в своем коде, чтобы решить, должны ли использоваться биты 32/64 бит. –

+0

Я действительно не понимаю, почему шаблон, как вы делаете против простой формы, поможет вам в этом? Не могли бы вы обновить свой вопрос, чтобы показать нам, почему вам нужно иметь такие параметры шаблона (и почему более простая форма не работает для вас)? – Holt

ответ

3

Проблема заключается в том, что stxxl::vector имеет не Тип шаблона типа:

BlockSize external block size in bytes, default is 2 MiB

Так что это не может быть ma tch против template <typename... >.

Не следует использовать параметр шаблона шаблон в этом случае, что-то вроде этого было бы лучше (я думаю):

template <typename t_vector> 
void method (t_vector &v) { 
    typedef typename t_vector::value_type::first_type t_x; 
    typedef typename t_vector::value_type::second_type t_y; 
    // or in c++11 and above 
    typedef decltype(v[0].first) t_xd; 
    typedef decltype(v[0].second) t_yd; 
} 

В приведенном выше, вы извлекаете t_x и t_y либо с помощью:

  • value_type что-то, что у всех Container должно быть (оба std::vector и stxxl::vector есть);
  • decltype, который непосредственно получает тип из выражения v[0].first (работает, даже если v пуст, так как выражение внутри decltype никогда не оценивается).

Из моего опыта, то лучше использовать очень общий аргумент шаблона, а затем извлечь из него информацию (value_type, decltype ...), чем пытаться тягот шаблон аргумент сам с заданными типами.

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