配列とポインターの動作が異なる関数を開発しようとしています。部分的な特殊化によってクラスに対しては実現できますが、関数に対しては機能しません!
int i = 0;
some_func( &i ); // pointer
int arr[ 3 ] = { 0 };
some_func( arr ); // array
some_func
2 番目のケースでは、関数パラメーターの型の内部は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
は、配列に対してのみ正確が必要です)。
マクロ定義の暗部に目を向けずに解決する方法はありますか?