在 C++ 中,您可以使用 SFINAE(Substitution Failure is not an Error)技术和 std::is_detected
来在编译期检测一个类是否已经重载了某个静态函数。以下是一个示例:
#include<iostream>
#include <type_traits>
template<typename T>
class has_static_func {
template<typename C>
static char test(decltype(&C::static_func));
template<typename C>
static long test(...);
public:
enum { value = sizeof(test<T>(0)) == sizeof(char) };
};
class MyClass {
public:
static void static_func() {
std::cout << "MyClass::static_func() called"<< std::endl;
}
};
class MyOtherClass {
public:
// static void static_func() {
// std::cout << "MyOtherClass::static_func() called"<< std::endl;
// }
};
int main() {
std::cout << "MyClass has static_func: "<< std::boolalpha<< has_static_func<MyClass>::value<< std::endl;
std::cout << "MyOtherClass has static_func: "<< std::boolalpha<< has_static_func<MyOtherClass>::value<< std::endl;
return 0;
}
在这个示例中,我们定义了一个 has_static_func
类模板,它接受一个类型 T
作为模板参数。test
函数尝试使用不同的参数类型调用 C::static_func
,并根据结果返回不同的类型。如果 C::static_func
存在且可访问,则返回 char
类型,否则返回 long
类型。value
成员变量根据 test
函数的返回值来确定是否存在 C::static_func
。
在 main
函数中,我们使用 has_static_func
类模板来检测 MyClass
和 MyOtherClass
是否有 static_func
静态函数。输出结果为:
MyClass has static_func: true
MyOtherClass has static_func: false
这表明 MyClass
有 static_func
静态函数,而 MyOtherClass
没有。
领取专属 10元无门槛券
手把手带您无忧上云