我很难理解下面的代码
template <typename T>
struct function_traits
: public function_traits<decltype(&T::operator())>
{};
// For generic types, directly use the result of the signature of its 'operator()'
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
// we specialize for pointers to member function
{
// ...
}
int main()
{
auto lambda = [](int i) { return long(i*10); };
typedef function_traits<decltype(lambda)> traits;
// ...
return 0;
}
出现在答案 https://stackoverflow.com/a/7943765/7006673 中.
这里,
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
似乎表明模板类的特殊化
template <typename T>
struct function_traits
但是,特化的模板参数列表template <typename ClassType, typename ReturnType, typename... Args>
不为空(即不等于 template <>
)。
有人可以帮我理解,这是什么类型的特化以及模板参数如何ClassType
, ReturnType
,和Args
推导出来的?
提前非常感谢。
最佳答案
What kind of specialization this is?
这是一个partial specialization 。 type_traits
显式实例化为:
T = ReturnType(ClassType::*)(Args...) const
但是这个T
依赖于ReturnType
, ClassType
,和Args
。这就是为什么你没有 template <>
在声明中(这将是 full specialization ),但是带有描述特定类型 T
的新参数的模板声明.
How the template parameters ClassType, ReturnType, and Args are deduced?
当使用适合此特化的表达式实例化模板时,就会推导出它们。在这里,ReturnType(ClassType::*)(Args...) const
只能用指向方法的指针替换。
这是 SFINAE 的示例.
关于c++ - 具有非空模板参数列表的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40110924/