这个模板的类型是什么?

时间:2012-04-15 19:34:25

标签: c++ templates

std::tr1::_Bind<void (*()(std::tr1::reference_wrapper<int>))(int&)>

我理解std::tr1::reference_wrapper<int>,这整个事情是某种函数指针返回void并以int&为参数。但我似乎无法在开头跟随 *()。代码是从一些gdb会话中剪下来的,我经历了一段时间。

另外,tr1 :: function的类型是什么?一些函数返回void并且不参数?

0x00000001000021a1 in std::tr1::function<void ()()>::operator() (this=0x7fff5fbffb98) at functional_iterate.h:865

但是以下是一个错误:

template <typename T>
void f()
{ 
  cout << "general\n";
}

template<>
void f<void ()()> () // this is error
{
  cout << "specific\n";
}

1 个答案:

答案 0 :(得分:4)

这是一个std::tr1::_Bind实例,它在一个函数类型上实例化std::tr1::reference_wrapper<int>并返回一个指向函数的指针,该函数引用int并返回void。

以下是阅读方法:

  • std::tr1::_Bind< type >应该清楚。
  • type = void ( fn )(int&)是一个功能int&并返回void
  • fn = * ptr 所以它实际上是一个指向函数的指针
  • ptr = ( fn2 )(std::tr1::reference_wrapper<int>)是一个取std::tr1::reference_wrapper<int>的函数,我们现在所做的是它的返回类型
  • fn2 =(空)因为我们没有给该函数(类型)一个名字。

然而,正如我现在注意到当 fn2 为空时,它周围的括号可能也不应该存在(类似于你如何编写函数类型“函数不带参数并返回void”) void(),而非void()()

std::tr1::function中的情况恰好是一个:一个不带参数的函数并返回void,在空的“函数名称”周围有额外的括号。

好的,现在对它进行了测试:gdb确实将void()输出为void()();这可能应该被视为gdb错误。

因此,在C ++中编写第一个类型的正确方法是:

std::tr1::_Bind<void (*(std::tr1::reference_wrapper<int>))(int&)>