2016-03-17 68 views
0

我一直在函数参数中使用C++模板类部分特化。我很惊讶地发现,相同的语法可以用于部分特化函子。函数和函子的C++模板部分特化的区别

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

我搜索了几个小时,但没有在这方面找到太多有价值的信息。任何人都可以解释为什么案例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

我不完全确定问题是什么。 'foo(int)'是一个函数的类型,它接受一个'int'并返回一个'foo'。 “foo”是否是函数是无关紧要的。 – TartanLlama

回答

0

在2例,是F(T)的功能服用T并返回F签名。

您可以通过identityftor通过result_ofF通过ReturnType以更好地匹配命名/重命名执行你的func类。