在C++中,要检查模板化类是否具有特定成员函数,可以使用SFINAE(Substitution Failure Is Not An Error)技术结合模板特化。以下是详细的解释和实例源代码:
std::void_t
和decltype
来检查成员函数是否存在。#include <iostream>
#include <type_traits>
// 步骤1:定义一个辅助模板,使用void_t和decltype进行SFINAE
template <typename T, typename = void>
struct has_member_function_check : std::false_type {};
template <typename T>
struct has_member_function_check<T, std::void_t<decltype(std::declval<T>().specificFunction())>> : std::true_type {};
// 步骤2:创建一个模板类
template <typename T>
class MyClass {
public:
// 模板类具有的成员函数
void commonFunction() {
std::cout << "Common Function" << std::endl;
}
// 成员函数的存在与否将在检查时确定
template <typename U = T>
std::enable_if_t<has_member_function_check<U>::value, void>
specificFunction() {
std::cout << "Specific Function" << std::endl;
}
};
// 步骤3:在主程序中使用检查函数
int main() {
// 类型T具有specificFunction
MyClass<struct WithFunction> objWithFunction;
objWithFunction.commonFunction();
objWithFunction.specificFunction();
// 类型T没有specificFunction
MyClass<struct WithoutFunction> objWithoutFunction;
objWithoutFunction.commonFunction();
// 下一行在编译时将导致错误,因为没有specificFunction
// objWithoutFunction.specificFunction();
return 0;
}
在这个例子中,has_member_function_check
是一个用于检查特定成员函数存在性的辅助模板。MyClass
是一个模板类,其 specificFunction
的存在与否将在编译时确定。通过在主程序中实例化不同类型的 MyClass
对象,我们可以看到如何检查特定成员函数的存在性。