c++ - 是否可以确定函数的参数对于可能的重载函数是有符号的还是无符号的?

标签 c++ c++11 c++14

有多种方法可以确定函数是否存在,也有多种方法可以确定函数是否具有特定签名。但是,当名称可能被重载 时,有没有办法确定它是否具有包含有符号或无符号参数的签名?

例子

struct A {
 void fn(int) {}
};

struct B {
 void fn(unsigned) {}
};

struct C {
 void fn(int) {}
 void fn(unsigned) {}
};

我能想到的最接近的可能是,如果我专门针对每个有符号类型进行测试,然后如果没有找到,则对每个无符号类型进行测试。但是,这将在未来排除任何枚举类型或新类型。

最佳答案

这是一种方法,适用于自由函数和成员函数。标准库中有一个类型特征,用于检查 unsigned-ness std::is_unsigned


看完下面的回答,稍微更新一下我的回答。以下是我将如何检查类型列表是否包含任何无符号数据类型。

我检查类型列表条件的常用方法与标准库中的方法类似。我写了一个小特征来帮助你概括这一点。请参阅下面的 AnyOf

#include <iostream>
#include <type_traits>

using namespace std;

template <template <typename...> class Predicate, typename TypeList>
struct AnyOf {
    static constexpr const bool value = false;
};
template <template <typename...> class Predicate,
          typename Head, typename... Tail>
struct AnyOf<Predicate, std::tuple<Head, Tail...>> {
    static constexpr const bool value
        = Predicate<Head>::value
            || AnyOf<Predicate, std::tuple<Tail...>>::value;
};

void foo(int) {}
void bar(unsigned) {}
struct Something {
    void foo(int);
    void bar(unsigned);
};

namespace detail {
    template <typename Func>
    struct IsFirstUnsignedImpl;
    template <typename ReturnType, typename... Args>
    struct IsFirstUnsignedImpl<ReturnType (*) (Args...)> {
        constexpr static const bool value
            = AnyOf<std::is_unsigned, std::tuple<Args...>>::value;
    };
    template <typename ClassType, typename ReturnType, typename... Args>
    struct IsFirstUnsignedImpl<ReturnType (ClassType::*) (Args...)> {
        constexpr static const bool value
            = AnyOf<std::is_unsigned, std::tuple<Args...>>::value;
    };
} // namespace detail

template <typename Func>
struct IsFirstUnsigned {
    constexpr static bool value
        = detail::IsFirstUnsignedImpl<std::decay_t<Func>>::value;
};

int main() {
    cout << std::boolalpha << IsFirstUnsigned<decltype(foo)>::value << endl;
    cout << std::boolalpha << IsFirstUnsigned<decltype(bar)>::value << endl;
    cout << std::boolalpha << IsFirstUnsigned<decltype(&Something::foo)>::value
         << endl;
    cout << std::boolalpha << IsFirstUnsigned<decltype(&Something::bar)>::value
         << endl;

    return 0;
}

关于c++ - 是否可以确定函数的参数对于可能的重载函数是有符号的还是无符号的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44298678/

相关文章:

C++ 错误 : array initializer must be an initializer list

c++ - 为什么在类中初始化的非整数静态数据成员必须是 constexpr?

c++ - 遍历文本文件并为每一行分配变量

c++ - 如何测试类型是否是具有非类型参数的模板的特化?

C++:如果 std::atomic_flag 是唯一的无锁原子类型,如何在 C++ 中实现无锁数据结构?

c++ - 引用是如何在内部实现的?

c++ - 如何在 C++ 中重复访问数组和 vector 的元素?

删除构造函数的 C++14 值初始化

c++ - 使用 JNI 从 C++ 库中加载特定类的方法

c++ - 我可以在函数的结果上使用 std::move 来构造一个新对象吗?