gpt4 book ai didi

c++ - 这被认为是 SFINAE 吗?

转载 作者:可可西里 更新时间:2023-11-01 16:10:17 24 4
gpt4 key购买 nike

大约一周前我问了一个问题,询问我如何才能简单地实例化一个类模板,前提是它采用的类型具有特定的成员函数。在我的回答中,我得到了一个复杂的解决方案。但后来我试着自己做。我只是想知道这是否足以找出给定类型 T 有一个名为 f 的 void 函数采用 0 个参数。

#include <type_traits>
#include <utility>

template <typename T, typename = void>
struct has_f : std::false_type { };

template <typename T>
struct has_f<
T,
decltype(std::declval<T>().f(), void())> : std::true_type { };

template <typename T, typename = typename std::enable_if<has_f<T>::value>::type>
struct A { };

struct B
{
void f();
};

struct C { };

template class A<B>; // compiles
template class A<C>; // error: no type named ‘type’
// in ‘struct std::enable_if<false, void>’

如果是这样,为什么 this thread? 中的其他答案如此复杂?

最佳答案

是的,您已经用最简单、最惯用的 C++11 SFINAE 风格解决了它。

请注意,您没有检查返回类型是否为 void,它是一个非静态成员,也没有检查没有参数。 f 可以不带任何参数地调用。它甚至可以是仿函数。

要检查返回 void 的无效成员非静态函数,请使用

template <typename T>
struct has_f<T, decltype(void( static_cast< void (T::*)( void ) >( &T::f ) )) >
: std::true_type {};

template <typename T>
struct has_f<T, decltype(void( static_cast< void (T::*)( void ) const >( &T::f ) )) >
: std::true_type {};

关于c++ - 这被认为是 SFINAE 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17124475/

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