Re[6]: сопоставление сигнатур
остается делать специализации для фундаментальных и стандартных типов, и для юзерских...
думаю сделать так:
template <typename >
struct my_typeid;
template <>
struct my_typeid<bool > {
enum : std::uint32_t { id = fnv1a("bool" ) };
};
template <>
struct my_typeid<std::int8_t> {
enum : std::uint32_t { id = fnv1a("std::int8_t" ) };
};
макросы все упрощают...
вопрос в том, как мне суммировать id`ы, полученные при хешировании?
т.е. предполагаю что-то вроде:
constexpr std::uint32_t sig_id() { return 0; }
template <typename Arg0, typename ... Args>
constexpr std::uint32_t sig_id(const Arg0&, const Args&... args) {
constexpr std::uint32_t id = my_typeid<Arg0>::id + sig_id(args...);
}
увеличит ли простое суммирование вероятность коллизий?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: сопоставление сигнатур
т.е. для контейнеров получается так:
template <typename K, typename V>
struct my_typeid<std::map<K, V>> {
enum : std::uint32_t { id = fnv1a("std::int8_t" ) + my_typeid<K>::id + my_typeid<V>::id };
};
какие могут проблемы/тупики?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[8]: сопоставление сигнатур
Здравствуйте, niXman, Вы писали:
X>т.е. для контейнеров получается так:
X>X>template <typename K, typename V>
X>struct my_typeid<std::map<K, V>> {
X> enum : std::uint32_t { id = fnv1a("std::int8_t" ) + my_typeid<K>::id + my_typeid<V>::id };
X>};
X>
X>какие могут проблемы/тупики?
my_typeid<std::map<int8_t, int32_t>>::id == my_typeid<std::map<int32_t, int8_t>>::id
Re[9]: сопоставление сигнатур
Здравствуйте, Chorkov, Вы писали:
C>my_typeid<std::map<int8_t, int32_t>>::id == my_typeid<std::map<int32_t, int8_t>>::id
кстати да...
так как же суммировать хеши?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[10]: сопоставление сигнатур
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Chorkov, Вы писали:
C>>my_typeid<std::map<int8_t, int32_t>>::id == my_typeid<std::map<int32_t, int8_t>>::id
X>кстати да...
X>так как же суммировать хеши?
Если бы не constexpr, я бы посоветовал
boost::hash_combine .
А так, можно умножить на простые числа:
constexpr std::uint32_t combine( std::uint32_t id0,
std::uint32_t id1=0, std::uint32_t id2=0, std::uint32_t id3=0, std::uint32_t id4=0,
std::uint32_t id5=0, std::uint32_t id6=0, std::uint32_t id7=0, std::uint32_t id8=0)
{
return id0*5 + id1+7 + id2*11 + id3*13 + id4*17 + id5*19 + id6*23 + id7*29 + id8*31;
}
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить