我正在尝试为数组和指针开发具有不同行为的函数。可以通过部分专业化来实现类,但不适用于函数!
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
数组精确)。
有没有解决方法,而不必转向宏定义的阴暗面?
在这里,我使用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 );
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句