C++ 无法理解此模板参数

C++ 无法理解此模板参数,c++,function-pointers,template-meta-programming,C++,Function Pointers,Template Meta Programming,也许是流感,或者我很笨,但我不能理解Crow框架代码的一部分。我的内部C++分析器失败了。p> template <typename MW> struct check_before_handle_arity_3_const { template <typename T, //this line void (T::*)(int, typename MW::context&) const = &T::before_handle >

也许是流感,或者我很笨,但我不能理解Crow框架代码的一部分。我的内部C++分析器失败了。p>
template <typename MW>
struct check_before_handle_arity_3_const
{
 template <typename T,
     //this line
     void (T::*)(int, typename MW::context&) const = &T::before_handle 
  >
    struct get
    { };
};
模板
在处理之前进行结构检查
{
模板
结构获取
{ };
};
我知道它是模板声明中的一个模板参数。看起来可能是lambda或函数指针类型的参数。。。但是,我不确定。 有人能解释一下这句话吗

更新: 在给出答案后,探索新获得的知识的深度,使我找到了以下一段摘录:

模板可以接受指向函数的指针作为非类型模板 参数(在本书中,非类型模板参数通常是 整数值。)[…]将指向函数的指针用作非类型 模板参数意味着我们不再需要将其存储在映射中。 这一重要方面需要彻底理解。我们 编译器不需要存储指向函数的指针 关于它的静态知识。因此,编译器可以硬编码 蹦床代码中的函数地址

所以,现在我知道了使用这种技术的原因之一

void(T::*)(int,typename MW::context&)const
是非类型。 它是指向
T
的成员函数的指针


使用
=&T::before\u handle
,其默认值设置为
&T::before\u handle

,我使用此技术的原因是支持两种处理程序格式:

在这里使用handle\u arity\u 3\u const之前检查:

    template <typename T>
    struct is_before_handle_arity_3_impl
    {
        template <typename C>
        static std::true_type f(typename check_before_handle_arity_3_const<T>::template get<C>*);

        template <typename C>
        static std::true_type f(typename check_before_handle_arity_3<T>::template get<C>*);

        template <typename C>
        static std::false_type f(...);

    public:
        static const bool value = decltype(f<T>(nullptr))::value;
    };
模板
结构是在句柄之前的
{
模板
静态std::true_type f(处理前的类型名检查_arity_3_const::模板get*);
模板
静态std::true_type f(在处理之前检查typename_\u arity_3::模板get*);
模板
静态std::false_类型f(…);
公众:
静态常量布尔值=decltype(f(nullptr))::值;
};
对于SFINAE,
是在句柄之前的值。arity\u 3\u impl::value
决定我们是否可以用3个参数调用句柄。通过使用
std::enable_if
,Crow可以调用适当的处理程序:

它是
T
的成员函数指针。顺便说一句,你忘了问问题。我的英语语法分析器看不到问号。你的问题是什么?这是否是C++?它是否会杀了你?这个更新是否可以作为一个问题?几乎可以。现在是肯定/否定的问题,答案是肯定的。它是一个模板非类型参数,类型为“指向
T
的成员函数的指针”,其中函数类型为“
void(int,typename MW::context&)const
”。