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

时间:2013-07-24 14:01:07

标签: c++ templates

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

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数组)。

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

2 个答案:

答案 0 :(得分:5)

获取数组by reference

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

template< typename T, size_t N >
void some_func( T (&t)[ N ] ) { ... }

答案 1 :(得分:2)

这里我使用C ++ 03中的C ++ 11样式编程来执行SFINAE并在一次重载时发送我的数组,在另一次重载时发送非数组:

#include <iostream>

struct false_type { enum { value = false }; };
struct true_type { enum { value = true }; };

template<typename T>
struct is_array:false_type {};
template<typename T, std::size_t N>
struct is_array<T[N]>:true_type {};

template<bool b,typename T=void>
struct enable_if {};
template<typename T>
struct enable_if<true, T> { typedef T type; };

template<typename T>
typename enable_if< is_array<T>::value>::type some_func( T& array, int unused=0 )
{
  std::cout << "array\n";
}

template<typename T>
typename enable_if< !is_array<T>::value>::type some_func( T const& not_array )
{
  std::cout << "pointer\n";
}

int main() {
  int x[3];
  some_func( x );
  int y;
  some_func( &y );
}