gpt4 book ai didi

c++ - 使用 cv 限定符和 ref 限定符实现 std::is_function

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:17 28 4
gpt4 key购买 nike

根据C++ reference ,这是 std::is_function 的有效实现(为简洁起见,不包括可变函数的部分特化和 noexcept 说明符):

template<class>
struct is_function : std::false_type { };

// specialization for regular functions
template<class Ret, class... Args>
struct is_function<Ret(Args...)> : std::true_type {};

// specialization for function types that have cv-qualifiers
template<class Ret, class... Args>
struct is_function<Ret(Args...)const> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)volatile> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)const volatile> : std::true_type {};

// specialization for function types that have ref-qualifiers
template<class Ret, class... Args>
struct is_function<Ret(Args...) &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)const &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)volatile &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)const volatile &> : std::true_type {};
struct is_function<Ret(Args...) &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)const &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)volatile &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)const volatile &&> : std::true_type {};

但是,在成员函数上使用 std::is_function 会返回 false:

struct X
{
int Test(float)
{
return 0;
}
};

int main()
{
auto x = std::is_function_v<decltype(&X::Test)>; // x is 'false'
return 0;
}

据我了解,cv-qualifiers 和 ref-qualifiers 仅适用于类成员函数。

所以我的问题是,为什么 std::is_function 的实现在不考虑成员函数“函数”的情况下专门针对所有不同的 cv 限定符和 ref 限定符?

更新:

根据下面的答案,我决定做一个实验。我实现了我自己的最小版本的 std::is_function:

template <class T>
struct IsFunction :
std::integral_constant<bool, false>
{
};

template <class R, class... A>
struct IsFunction<R(A...)> :
std::integral_constant<bool, true>
{
};

template <class T>
constexpr bool IsFunctionV = IsFunction<T>::value;

然后我更改了 X::Test 的签名:

struct X
{
int Test(float) const
{
return 0;
}
};

使用答案中提供的 function_traits 结构,然后我尝试了这个:

auto x = IsFunctionV<function_traits<decltype(&X::Test)>::type>;

在这种情况下,x 为假。但是,如果我像这样将 const 的特化添加到我的 IsFunction 中:

template <class R, class... A>
struct IsFunction<R(A...) const> :
std::integral_constant<bool, true>
{
};

那么 x 将为 true!所以过载很重要。但我不确定我是否理解为什么或 function_traits 最终将“成员函数指针”转换为“成员函数”,这与常规函数并不完全相同,是吗...?

最佳答案

As far as I understand it, cv-qualifiers and ref-qualifiers are only applicable to class member functions.

虽然非成员函数不能有 cv 限定符或 ref 限定符,但函数类型仍然可以包含它们而无需绑定(bind)到特定的类类型。

typedef void fc() const;
struct S { fc f; };
void S::f() const { }

在这里,std::is_function_v<fc>应该是 true .

关于c++ - 使用 cv 限定符和 ref 限定符实现 std::is_function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44060606/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com