我一直在使用函数参数的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;
}
答案 0 :(得分:0)
在这2个案例中,F(T)
是执行T
并返回F
的函数的签名。
您可以按func
将identity
和ftor
重命名为result_of
,F
ReturnType
重命名,以更好地匹配命名/实施。