没有typename

时间:2017-03-26 15:51:26

标签: c++ templates typename

我在SO上阅读the following question and its associated accepted answer,我想知道struct C(没有typename关键字的那个)的第二个模板参数的含义是什么。

以下是代码:

template<typename T, T> struct C; // Here.

template<typename T, typename R, typename ...Args, R (T::*F)(Args...)>
struct C<R (T::*)(Args...), F> 
{
    R operator()(T &obj, Args&&... args) 
    {
        return (obj.*F)(std::forward<Args>(args)...);
    }
};

我知道代码在做什么,但我没有想出T声明的第二个template<typename T, T> struct C;及其含义的目的,而没有typename关键字。

有人可以告诉我它的含义吗?谢谢你的回答。

2 个答案:

答案 0 :(得分:2)

它的模板值参数。

template<typename T, T> struct C;

表示您定义类型T,然后还将类型T的值传递给模板。在SO问题的例子中,类型是函数指针类型,然后第二个T的值是指向匹配类型函数的实际指针。

答案 1 :(得分:0)

T已在第一个typename T中定义,

因此,如果您在第二个T中添加class或再次typename T,您将获得:

error C2991: redefinition of template parameter 'T'