2015-06-02 3 views
2

Я работаю над реализацией хэш-функций, в основном основанных на трюке Картера и Вегмана. Основываясь на размере входного пространства, используемое основное значение должно быть достаточно длинным, чтобы обеспечить надежный хэш, например. если я хочу хэш для uint32_t, я буду использовать Mersenne prime 2^61-1, и поэтому мне нужен uint64_t; для uint16_t мне также нужен uint64_t и т. д.Получение типа переменной на основе другого типа переменной в C++

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

До сих пор I have something like:

template<typename T1, typename T2> 
    class Hash_CW2: public Hash<T1>{ 
     protected: 
      T2 seeds[2]; 
      [...] 
      void init(unsigned B, T2 seed0, T2 seed1); 

     public: 
      Hash_CW2(unsigned B, T2 seed0, T2 seed1); 
      [...] 
      virtual unsigned element(T1 j); 
}; 

И я хотел бы иметь что-то вроде:

template<typename T1, typename T2=GET_TYPE(T1)> 
    class Hash_CW2: public Hash<T1>{ 
     [...] 
}; 

Любая идея, как это сделать? Является ли это возможным?

Большое спасибо!

+1

Как об использовании [шаблона специализации] (http://www.cprogramming.com/tutorial/template_specialization.html)? Возможно, в сочетании с наследованием? –

ответ

6

Использование шаблона специализации вы могли бы сделать что-то вроде:

template <typename T> 
struct hash_type_for; 

template <> 
struct hash_type_for<uint16_t> 
{ using type = uint64_t; }; 

template <> 
struct hash_type_for<uint32_t> 
{ using type = uint64_t; }; 

template <typename T> 
using hash_type_for_t = typename hash_type_for<T>::type; 

Затем использовать его как это:

template<typename T1, typename T2 = hash_type_for_t<T1>> 
class Hash_CW2: public Hash<T1>{ 

Или, если вы хотите T2 быть рассчитаны исключительно из T1 и не хотите пользователь должен быть в состоянии изменить его:

template<typename T1> 
class Hash_CW2: public Hash<T1>{ 
    using hash_type = hash_type_for_t<T1>; 
+0

Спасибо! это именно то, что я искал :) – Ester

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