C++ 有没有办法只通过名称来检测重载的成员函数?(不检测名称)
我在这里是一厢情愿的,但我想准确地回答这个问题。我想改进仅通过名称检测成员模板的实现,但遇到了一个障碍。我找不到任何方法来检测重载的C++ 有没有办法只通过名称来检测重载的成员函数?(不检测名称),c++,templates,typetraits,overloading,member-functions,C++,Templates,Typetraits,Overloading,Member Functions,我在这里是一厢情愿的,但我想准确地回答这个问题。我想改进仅通过名称检测成员模板的实现,但遇到了一个障碍。我找不到任何方法来检测重载的静态/非静态成员函数。这个问题非常重要的一部分是,我不能使用,因为它检测任何名称(我已经在当前的实现中使用了它,有点有用),我不能指定类型,因为这忽略了单独使用名称的意义 有关参考,请参阅我的。我发布了当前的有\u成员\u模板\u栏实现。我不认为我应该把所有的东西都贴在这个问题上 问题是一样的——我们能在不指定参数或使用上述技巧的情况下检测重载成员函数吗?我知道我可
静态
/非静态
成员函数。这个问题非常重要的一部分是,我不能使用,因为它检测任何名称(我已经在当前的实现中使用了它,有点有用),我不能指定类型,因为这忽略了单独使用名称的意义
有关参考,请参阅我的。我发布了当前的有\u成员\u模板\u栏
实现。我不认为我应该把所有的东西都贴在这个问题上
问题是一样的——我们能在不指定参数或使用上述技巧的情况下检测重载成员函数吗?我知道我可能是在要求不可能的事情,但要求从来都没有坏处
问题是一样的——我们能在不指定参数或使用上述技巧的情况下检测重载成员函数吗?我知道我可能是在要求不可能的事情,但要求从来都没有坏处
事实上,这并非不可能。下面是一个简单的工作示例:
template<typename T, typename R, typename... A>
void proto(R(T::*)(A...));
template<typename, typename = void>
constexpr bool has_single_f = false;
template<typename T>
constexpr bool has_single_f<T, decltype(proto(&T::f))> = true;
struct S {
void f(int) {}
void f(char) {}
};
struct U {
void f() {}
};
int main() {
static_assert(not has_single_f<S>, "!");
static_assert(has_single_f<U>, "!");
}
从示例代码中可以看到,static\U assert
s验证f
是否在s
中重载,而不是在U
中重载
上面的示例基于模板变量,这些变量是自C++14以来语言的一部分。
如果您更喜欢使用C++11的基于结构的解决方案,可以使用以下检测器:
#include<type_traits>
//...
template<typename, typename = void>
struct has_single_f: std::false_type {};
template<typename T>
struct has_single_f<T, decltype(proto(&T::f))>: std::true_type {};
//...
int main() {
static_assert(not has_single_f<S>::value, "!");
static_assert(has_single_f<U>::value, "!");
}
#包括
//...
模板
结构具有_single_f:std::false_type{};
模板
结构有_single_f:std::true_type{};
//...
int main(){
静态断言(不具有单值“!”;
静态断言(具有单值“!”;
}
有趣的问题,找到这样做的方法很有趣+1我开始觉得使用模板没有什么是不可能的:)。回答得好!
#include<type_traits>
//...
template<typename, typename = void>
struct has_single_f: std::false_type {};
template<typename T>
struct has_single_f<T, decltype(proto(&T::f))>: std::true_type {};
//...
int main() {
static_assert(not has_single_f<S>::value, "!");
static_assert(has_single_f<U>::value, "!");
}