- 此问题在此处已有答案**:
Checking for existence of an (overloaded) member function(3个答案)
昨天关门了。
我写了一个trait,通过std::is_member_function_pointer
检测类是否有某个公共成员函数:
class Test1
{
public:
void method();
};
class Test2
{
public:
void method();
void method(int);
};
template <typename T, typename = void>
struct HasMethod : std::false_type
{
};
template <typename T>
struct HasMethod<T, std::enable_if_t<std::is_member_function_pointer<decltype(&T::method)>::value>>
: std::true_type
{
};
int main()
{
std::cout << HasMethod<Test1>::value << std::endl; // prints 1
std::cout << HasMethod<Test2>::value << std::endl; // prints 0
}
然而,当函数被重载时,std::is_member_function_pointer
似乎无法检测到它,如Test2
所示。是否有一种方法可以使它工作,而不管方法是否被重载?
1条答案
按热度按时间v8wbuo2f1#
要检测类成员的存在,通常的方法是使用
std::void_t
模板。您可以这样做:好的。经过一番思考,我找到了解决方案。我们可以使用
declval(&T::method)
将失败的事实,如果有一个以上的过载,来检测我们是否有至少一个过载,通过添加另一个。这里是解决方案。它是相当冗长,但我无法减少它。至少它的工作。