我在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
关键字。
有人可以告诉我它的含义吗?谢谢你的回答。
答案 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'