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