позволить шаблону выбирать между char / short / int, указав битовый размер? - PullRequest
8 голосов
/ 01 февраля 2012

У меня есть что-то вроде этого:

template<int SIZE>
struct bin {
private:
public:
    struct {
        int _value : SIZE;
    };
}

Можно ли изменить тип данных _value в зависимости от размера?Если SIZE <= 7, я хочу, чтобы _value был char.Если это> = 8 и <= 15, я хочу, чтобы оно было коротким, а если <= 31, я хочу, чтобы оно было целым числом. </p>

Ответы [ 2 ]

10 голосов
/ 01 февраля 2012

Это не особенно элегантно, но:

template <unsigned int N>
struct best_integer_type {
    typedef best_integer_type<N-1>::type type;
};

template <>
struct best_integer_type<0> {
    typedef char type;
};

template <>
struct best_integer_type<8> {
    typedef short type;
};

template <>
struct best_integer_type<16> {
    typedef int type;
};

template <>
struct best_integer_type<32> {
    // leave out "type" entirely, to provoke errors
};

Тогда в вашем классе:

typename best_integer_type<SIZE>::type _value;

Он не имеет дело с отрицательными числами для SIZE. Как и ваш исходный код, но в текстовом описании говорится, что нужно использовать char, если SIZE <= 7. Я ожидаю, что 0 <= SIZE <= 7 сделает.

8 голосов
/ 01 февраля 2012

Boost.Integer имеет утилиты для выбора типа :

boost::int_t<N>::least
Наименьший встроенный тип со знаком со знаком как минимум с N битами, включаябит знакаПараметр должен быть положительным числом.Ошибка времени компиляции возникает, если параметр больше, чем число битов в наибольшем целочисленном типе.

boost::int_t<N>::fast
Самый простой в обращении встроенный тип со знаком со знаком, по крайней мере, с N битами, включая знаковый бит.Параметр должен быть положительным числом.Ошибка времени компиляции возникает, если параметр больше, чем число битов в наибольшем целочисленном типе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...