数组和指针功能的不同行为

伊戈尔·谢梅诺夫(Igor Semenov)

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

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

有没有解决方法,而不必转向宏定义的阴暗面?

Yakk-亚当·内夫罗蒙特

在这里,我使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

功能提升的不同行为

来自分类Dev

指针取消引用的不同行为

来自分类Dev

char指针参数的不同行为

来自分类Dev

tty和pty的不同行为

来自分类Dev

javascript和jquery的不同行为

来自分类Dev

endl 和 \n 与 fork() 的不同行为

来自分类Dev

printf 和 fprintf 之间的不同行为

来自分类Dev

page.evaluate和page。$具有后续功能的不同行为

来自分类Dev

Unique_ptr与原始指针的不同行为

来自分类Dev

for循环中或展开循环时功能的不同行为

来自分类Dev

rsync的不同行为

来自分类Dev

指针数组功能参数-奇数行为

来自分类Dev

GCC和Clang在constexpr构造函数上的不同行为

来自分类Dev

TreeStore:autoLoad配置和load()函数之间的不同行为

来自分类Dev

在Dictionary和ConcurrentDictionary之间修改集合时的不同行为

来自分类Dev

clang和gcc使用复合文字的不同行为

来自分类Dev

ComboBox,Windows 7和8.1上的不同行为

来自分类Dev

理解2.9和2.10中的不同行为

来自分类Dev

了解findAll和findOne的Hibernate / JPA的不同行为

来自分类Dev

使用CLI和Maven时Liquibase的不同行为

来自分类Dev

pylab:shell和脚本中的不同行为

来自分类Dev

Haskell中Applicative在元组和列表上的不同行为

来自分类Dev

红宝石中“ do .. end”和“ {..}”块的不同行为

来自分类Dev

CString运算符“ + =”和“ +”之间的不同行为

来自分类Dev

嵌套类中g ++和clang ++之间的不同行为

来自分类Dev

文本和标签控件与CSS组合的不同行为

来自分类Dev

for循环上->(右箭头)和<-(左箭头)的不同行为

来自分类Dev

在GCC和MSVC中,consteval的不同行为

来自分类Dev

tkinter <KeyRelease>在Windows和Linux上的不同行为

Related 相关文章

热门标签

归档