Я пытаюсь разработать функцию с различным поведением для массивов и указателей. Это может быть достигнуто для классов по частичной специализации, но это не работает с функциями!Различное поведение функции для массивов и указателей
int i = 0;
some_func(&i); // pointer
int arr[ 3 ] = { 0 };
some_func(arr); // array
Во втором случае внутри функции some_func
типа параметра является int*
, и нет никакого способа узнать, что это на самом деле int[3]
.
С другой стороны, если я использую класс специализации шаблона, я должен был бы указать массив типа явно:
template< typename T >
struct S
{
static void some_func(T t) { ... }
};
template< typename T, size_t N >
struct S< T[ N ] >
{
static void some_func(T t[ N ]) { ... }
};
// ...............
int arr[ 3 ] = { 0 };
S< int[ 3 ] >::some_func(arr); // Works,
// but specifying type explicitly is not convenient
Сейчас я решила проблему с макро определить (чтобы быть точным, я нужен только точный sizeof
для массивов).
Есть ли способ решить эту проблему, не обращаясь к темной стороне макроопределений?
Это, предположительно, то, что «std :: array» было изобретено для решения. –
К сожалению, я не могу использовать C++ 11. –
Затем используйте 'std :: tr1 :: array', в C++ 98. –