0

配列とポインターの動作が異なる関数を開発しようとしています。部分的な特殊化によってクラスに対しては実現できますが、関数に対しては機能しません!

int i = 0;
some_func( &i ); // pointer
int arr[ 3 ] = { 0 };
some_func( arr ); // array

some_func2 番目のケースでは、関数パラメーターの型の内部は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 に答える