有多种方法可以确定函数是否存在,也有多种方法可以确定函数是否具有特定签名。但是,当名称可能被重载 时,有没有办法确定它是否具有包含有符号或无符号参数的签名?
例子
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/