这个模板定义在c ++中是什么意思?

时间:2018-09-11 11:54:27

标签: c++ c++11

我正在阅读一些c ++代码,下面的代码列表让我感到非常困惑。
我可以猜测它试图定义一个专门的模板,该模板试图特征化输入args类型。但是我有几个问题:
第一个模板看起来像是派生和模板特化,如果是派生,那么如何从自身派生结构?如果是模板专业化,模板定义在哪里?

template<typename F>
struct function_traits : public function_traits<decltype(&F::operator())>
{};

template<typename R, typename C, typename ... Args>
struct function_traits<R(C::*)(Args...) const> {
    template<size_t i>
    struct arg
    {
        using type = typename std::tuple_element<i, std::tuple<Args...>>::type;
    };
};

1 个答案:

答案 0 :(得分:6)

第一个声明只是struct function_traits的主要模板的定义。请注意,从模板的不同专业化派生而来的模板的特定专业化没有问题(只要没有循环)。请记住,类模板的每个专业化都是不同的,不相关的类型。

第二个声明仅介绍了函数类型的部分专门化,其实例化可能会用作主要模板的基类(因为主要模板源自其模板参数是成员函数类型的专门化)。 / p>