我正在尝试为数组和指针开发一个具有不同行为的函数。 可以通过部分特化来实现类,但它不适用于函数!
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
数组)。
有没有办法解决它而不转向宏定义的阴暗面?
答案 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 );
}