Как надежно специализировать шаблон с intptr_t в средах на 32 и 64 бита?

У меня есть шаблон, который я хочу специализировать с двумя международными типами, одним из них простой int и другой intptr_t. На платформе на 64 бита у них есть различные размеры, и я могу сделать это легко, но на 32 битах оба типа являются тем же, и компилятор бросает ошибку о переопределении. Что я могу сделать для фиксации его за исключением отключения одного из определений прочь с препроцессором?

Некоторый код как пример:

template<typename T>
type * convert();

template<>
type * convert<int>() { return getProperIntType(sizeof(int)); }

template<>
type * convert<intptr_t>() { return getProperIntType(sizeof(intptr_t)); }

//this template can be specialized with non-integral types as well, 
// so I can't just use sizeof() as template parameter.
template<>
type * convert<void>() { return getProperVoidType(); }
7
задан Kirill V. Lyadvinsky 25 May 2010 в 18:53
поделиться

1 ответ

То, что вы пытаетесь достичь, в принципе невозможно: intptr_t - это typedef для int в 32-битных системах, поэтому компилятор не может их различить. Однако ваш пример можно решить, просто выделив пустой случай:

template<typename T>
type * convert() { return getProperIntType(sizeof(T)); }

template<>
type * convert<void>() { return getProperVoidType(); }
2
ответ дан 7 December 2019 в 18:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: