数组和指针的不同函数行为

Igo*_*nov 0 c++ templates

我正在尝试为数组和指针开发一个具有不同行为的函数.可以通过部分特化来实现类,但它不适用于函数!

int i = 0;
some_func( &i ); // pointer
int arr[ 3 ] = { 0 };
some_func( arr ); // array
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,函数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
Run Code Online (Sandbox Code Playgroud)

现在我已经用宏定义解决了这个问题(确切地说,我只需要精确sizeof的数组).

有没有办法解决它而不转向宏定义的阴暗面?

eca*_*mur 5

通过引用获取数组:

template< typename T >
void some_func( T *t ) { ... }

template< typename T, size_t N >
void some_func( T (&t)[ N ] ) { ... }
Run Code Online (Sandbox Code Playgroud)