具有非空模板参数列表的模板专业化

亚伯拉罕·希尔伯特

我很难理解以下代码

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 <>)。有人可以帮我明白了,什么样的专业化,这是怎样的模板参数ClassTypeReturnType以及Args推导出?

提前谢谢了。

rgmt

这是什么样的专业化?

这是部分专业化type_traits用以下方法显式实例化:

T = ReturnType(ClassType::*)(Args...) const

但是,这T是依赖于ReturnTypeClassTypeArgs这就是为什么您没有template <>在声明中(这将是一个完整的专长),而是在模板声明中包含了描述特定类型的新参数的原因T

如何推导模板参数ClassType,ReturnType和Args?

当使用适合该专业的表达式实例化模板时,就可以推导出它们。在这里,ReturnType(ClassType::*)(Args...) const只能用指向方法的指针来代替。

这是SFINAE的示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有模板模板参数的类模板专业化

类模板专业化,C ++,模板参数列表中的参数2不匹配

具有部分专业化的类模板参数推导

具有更多模板参数的部分专业化

可变参数模板是否必须具有非空参数包的可调用专业化格式,以便格式正确?

具有模板化功能的专业化模板类

(特别是显式)专业化中的模板参数列表的访问检查规则

没有模板参数的功能模板专业化

带有模板参数的模板专业化

具有容器模板的总类模板专业化

C ++ 11中具有多个模板参数的模板函数的专业化

具有std :: enable_if的C ++可变参数模板部分模板专业化

模板参数的模板专业化

具有多个参数的模板化类专业化,其中一个模板参数是模板本身

为什么可变参数模板的模板专业化与非可变模板的专业化不同?

模板别名,模板专业化和模板模板参数

带有默认参数的模板专业化

带有参数包的模板专业化

具有非类型参数的部分模板专业化:GCC与MSVS

具有任何非类型参数的C ++模板专业化

具有std :: if_enabled_t参数的模板功能的完全专业化

具有多个条件的默认模板专业化

具有相关值的模板专业化

具有cv和ref类型的模板专业化

具有多种类型的类的模板专业化

具有编译时间常数的模板专业化

具有模板专业化的泛型类型转换

具有特定接口的C ++模板专业化

具有部分专业化的模板子类化