Название немного двусмысленное.
Допустим, у меня есть шаблон, определенный как:
template < typename T >
void foo ( int x ) ;
template <>
void foo<char> ( int x ) ;
template <>
void foo<unsigned char> ( int x ) ;
template <>
void foo<short> ( int x ) ;
...
Внутренне и foo<signed>()
, и foo<unsigned>()
делают одно и то же. Единственное требование состоит в том, чтобы T
был 8-битным типом.
Я мог бы сделать это, создав еще один шаблон для определения стандартного типа на основе размера.
template < typename T, size_t N = sizeof( T ) > struct remap ;
template < typename T, size_t > struct remap< 1 >
{
typedef unsigned char value;
}
...
Обратите внимание, что шаблоны функций не могут иметь параметры по умолчанию. Это решение только переносит проблему в другой шаблон, а также создает проблему, если кто-то пытается передать тип структуры в качестве параметра.
Каков самый элегантный способ решить эту проблему без повторения этих объявлений функций?
Это не вопрос С++ 11.
enable_if
также могут быть реализованы на C++03. - person dyp   schedule 13.07.2013foo<signed>
иfoo<unsigned>
. Есть и другие способы, похожие на вашеremap
предложение, но я думаю, что вы получите больше кода, чтобы избежать дублирования. - person dyp   schedule 13.07.2013foo<signed char>
иfoo<unsigned char>
, верно?signed
иunsigned
- этоint
s, и они имеют ширину не менее 16 бит. Также обратите внимание, чтоchar
,signed char
иunsigned char
— это три разных типа. - person dyp   schedule 13.07.2013