0

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

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

有什么方法可以在不转向宏定义的阴暗面的情况下解决它?

4

2 回答 2

5

通过引用获取数组:

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

template< typename T, size_t N >
void some_func( T (&t)[ N ] ) { ... }
于 2013-07-24T14:04:11.817 回答
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 );
}
于 2013-07-24T14:39:44.600 回答