c++ - 如何检查 C++ 编译时是否存在运算符的特定重载?

标签 c++ c++11 templates sfinae

我有一个类,它为多种输入类型重载 () 运算符,即

struct Type {
    void operator()(int);
    void operator()(std::string);
};

现在,我想使用 SFINAE 检查是否存在特定的 () 运算符重载,即

if (Type()(std::string) overload exists) {
    // do something...
}

这在 C++11 中可行吗? (我不能使用 C++14 或 C++17)。

注意:在实际代码中,有一个模板类接受具有某些属性的类类型。该模板中有一个成员函数,它将根据参数类型的 () 运算符的某些特定重载是否存在而专门化。

最佳答案

使用 SFINAE 检查是否可以创建指向成员的指针以重载 operator()你正在寻找。

下面是我的做法:

#include <type_traits>

template <typename A, typename B, typename = void>
struct has_overload : std::false_type {};
template <typename A, typename B>
struct has_overload<A, B, decltype((void)(void (A::*)(B))&A::operator())> : std::true_type {};

用法:has_overload<Type, std::string>::value .

关于c++ - 如何检查 C++ 编译时是否存在运算符的特定重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57131705/

相关文章:

c++ - 非阻塞线程安全堆栈

c++ - 为什么 std::move 会阻止 RVO(返回值优化)?

c++ - 如何测试从 std::istream 读取类?

c++ - 类型推导失败,指针指向成员方法

django - django中是否有任何tile类型的概念

c++ - 如何在C++中实例化模板

c++ - 大O计算

c++ - lldb 未解析的断点通过 C++ api

c++ - 当我们创建一个带有指针参数的参数化构造函数时会发生什么?

c++ - 有截断吗?