2015-03-03 4 views
1

Я пытаюсь вычислить константу в зависимости от типа и некоторого другого значения с помощью метапрограммирования шаблонов.Специализация шаблона в зависимости от типа

template <typename t, uint8_t number_of_bits> struct bin_size {}; 

template <> 
struct bin_size<uint8_t, uint8_t number_of_bits> { 
    const uint8_t upper_bound = 255; 
}; 

template <> 
struct bin_size<int32_t, uint8_t number_of_bits> { 
    const uint8_t upper_bound = 60 * number_of_bits * 10; 
}; 

Однако компилятор (ARM-None-EABI-G ++ (GNU Инструменты для ARM встраиваемых процессоров (Ардуино построить)) 4.8.3 20140228 (выпуск) [ARM/версия встроенного-4_8-ветви 208322] ) жалуется на следующие ошибки.

test.cpp:287:52: error: template argument 2 is invalid 
    struct bin_size<uint8_t, uint8_t number_of_bits> { 
                ^
test.cpp:292:52: error: template argument 2 is invalid 
    struct bin_size<int32_t, uint8_t number_of_bits> { 
                ^
Error compiling. 

Без функции number_of_bits все работает как следует. Но я не могу понять, как специализироваться на имени типа, но не на количестве бит. Как это может быть сделано?

+0

В данном конкретном случае я решил его таким образом: шаблон <имяТипа bins_t, uint8_t NUMBER_OF_BITS> структура bin_size { сопзЬ bins_t upper_bound = sizeof (upper_bound) == 1? 255: 60 * number_of_bits * 10; }; Но все же мне интересно, как это можно решить с помощью метапрограммного подхода. –

ответ

3

Просто добавьте параметр шаблона ожидает номер и использовать его имя в вашей специализации:

template <uint8_t number_of_bits> 
struct bin_size<uint8_t, number_of_bits> { 
    const uint8_t upper_bound = 255; 
}; 

template <uint8_t number_of_bits> 
struct bin_size<int32_t, number_of_bits> { 
    const uint8_t upper_bound = 60 * number_of_bits * 10; // You forgot "_t" here. 
}; 

Таким образом, специализация является частичной и d все еще зависит от чего-то (number_of_bits в вашем случае)

Вот пример: https://ideone.com/fvTa0O

+0

Хммм, я скопировал это в свой код и получаю точно такую ​​же ошибку, как раньше. –

+0

Возможно, вы, вероятно, не копировали правильно. Как вы можете видеть на примере, он компилируется отлично. По крайней мере, вы поняли, что я изменил? – Telokis

+0

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

3

Сделать number_of_bits шаблонный аргумент:

template <uint8_t number_of_bits> 
struct bin_size<uint8_t, number_of_bits> { 
    const uint8_t upper_bound = 255; 
}; 

template <uint8_t number_of_bits> 
struct bin_size<int32_t, number_of_bits> { 
    const uint8 upper_bound = 60 * number_of_bits * 10; 
}; 
3

(частичная) специализация должна быть что-то вроде:

template <uint8_t number_of_bits> 
struct bin_size<uint8_t, number_of_bits> { 
    const uint8_t upper_bound = 255; 
}; 
Смежные вопросы