功能和仿函数的C ++模板部分特化之间的区别

时间:2016-03-17 08:40:00

标签: c++

我一直在使用函数参数的C ++模板类部分特化。我惊讶地发现可以使用相同的语法来部分专门化仿函数。

在下面的情况1中,很容易看出F(T)是函数类型。由于它是一个类型,它可以用来替换模板参数,但是在情况2中,F(T)的语义被改变,它不是一个类型,但仍然可以通过编译器和工作。

我用Google搜索了几个小时,但在这方面没有找到太多有价值的信息。谁能解释为什么案例2有效?

template<class> struct func; 

template<class F, class T>
struct func<F(T)>              //1. this is a partial specialization for function
{                              //with signature F(T)
   using type = F(T);
};

template<class> struct ftor;
template<class F, class T>
struct ftor<F(T)>              //2. Is F(T) a type?
{
   using type = F;
};

struct foo {
  void operator()(int) {}
};

int main() {    
    //1 void(int) is a function signature
    cout<<typeid(typename func<void(int)>::type).name()<<endl;
    //2 what is foo(int)?
    cout<<typeid(typename ftor<foo(int)>::type).name()<<endl;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

在这2个案例中,F(T)是执行T并返回F的函数的签名。

您可以按funcidentityftor重命名为result_ofF ReturnType重命名,以更好地匹配命名/实施。