我很难理解以下代码
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
推导出?
提前谢谢了。
这是什么样的专业化?
这是部分专业化。type_traits
用以下方法显式实例化:
T = ReturnType(ClassType::*)(Args...) const
但是,这T
是依赖于ReturnType
,ClassType
和Args
。这就是为什么您没有template <>
在声明中(这将是一个完整的专长),而是在模板声明中包含了描述特定类型的新参数的原因T
。
如何推导模板参数ClassType,ReturnType和Args?
当使用适合该专业的表达式实例化模板时,就可以推导出它们。在这里,ReturnType(ClassType::*)(Args...) const
只能用指向方法的指针来代替。
这是SFINAE的示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句