c++ - 具有非空模板参数列表的模板特化

标签 c++ templates c++14 template-specialization type-deduction

我很难理解下面的代码

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 specializationtype_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/

相关文章:

c++ - 使用内联 CPP 调用 so 文件中的函数不起作用

c++ - 如何在另一个终端中从 C++ 打开和稍后关闭另一个程序?

c++ - 不支持基本模板的概念专用模板

匹配任何类型参数的 C++ 可变参数模板模板参数

c++ - 有没有办法在对象上保持弱引用并控制它的生命周期?

c++ - 通过引用传递在 C 中有效,但不适用于此代码的 C++

templates - 测试是否 ui :insert has been defined in the template client

c++ - 如何重载带有各种参数的lambda函数?

c++ - 是否可以通过 lambda 将变量模板传递给函数?

c++ - 是否可以将模板专门用于语言链接?