使用自定义签名检查成员函数是否存在
在本文中,我们解决了确定 C 类是否拥有特定成员函数的挑战带有指定的签名。与 Scott Meyers 书中讨论的问题不同,这里的目标是区分拥有和缺乏该功能的类。
模板技巧
为了实现这一点,我们引入利用 C 11 功能的模板技巧。 has_serialize 模板结构充当主模板,并断言第二个模板参数必须是函数类型。
函数验证的专业化
has_serialize 模板的专业化处理实际的功能验证。它使用两个模板函数:
函数验证
测试 C 类中是否存在带有签名 Ret(Args...) 的特定函数 f(Args...):
std::cout << has_serialize<C, Ret(Args...)>::value << endl;
示例用法
在下面的示例中,我们定义了两个类,X 和Y,其中Y继承自X。类X有一个返回int的成员函数serialize(const std::string&)。
使用has_serialize模板,我们可以验证X和Y都拥有serialize函数具有正确的签名:
struct X { int serialize(const std::string&) { return 42; } }; struct Y : X {}; std::cout << has_serialize<X, int(const std::string&)>::value << endl; // 1 (true) std::cout << has_serialize<Y, int(const std::string&)>::value << endl; // 1 (true)
这演示了 has_serialize 模板技巧如何有效地检测类是否包含给定的特定成员函数签名。
以上是如何检查C类是否有带有特定签名的成员函数?的详细内容。更多信息请关注PHP中文网其他相关文章!