Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法只通过名称来检测重载的成员函数?(不检测名称)_C++_Templates_Typetraits_Overloading_Member Functions - Fatal编程技术网

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, "!");
}