C++ 无法理解此模板参数
也许是流感,或者我很笨,但我不能理解Crow框架代码的一部分。我的内部C++分析器失败了。p>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 >
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
”。