gpt4 book ai didi

c++ - 使用 SFINAE 检测模板化成员函数的存在

转载 作者:可可西里 更新时间:2023-11-01 18:31:05 26 4
gpt4 key购买 nike

我了解到 SFINAE 可用于确定类中是否存在成员函数。例如,以下代码可用于检查方法 hello 是否存在于类中。

struct has_method_hello {

using yes = char[1];
using no = char[2];

template <typename U, typename C>
static constexpr yes& test(decltype(&U::hello));

template <typename>
static constexpr no& test(...);

static constexpr bool value = (sizeof(yes) == sizeof(test<T>(nullptr)));

};

struct Foo {
void hello() {}
}

std::cout << has_method_hello <Foo> :: value << std::endl; // 1

但是,假设 hello 是模板化的,我怎样才能修改技巧使其仍然可以正常运行?

struct Foo {
template <typename T>
void hello(T&) {...}
}

最佳答案

From here:

namespace details {
template<template<class...>class Z, class, class...>
struct can_apply:std::false_type{};
template<template<class...>class Z, class...Ts>
struct can_apply<Z, std::void_t<Z<Ts...>>, Ts...>:
std::true_type{};
}

template<template<class...>class Z, class...Ts>
using can_apply=details::can_apply<Z, void, Ts...>;

现在您想知道是否可以调用foo.hello(int&):

我们有 hello_r 可以为您提供调用 .hello 的返回类型:

template<class F, class...Ts>
using hello_r = decltype(std::declval<F>().hello( std::declval<Ts>()... ));

这导致 can_hello:

template<class F, class...Ts>
using can_hello = can_apply<hello_r, F, Ts...>;

现在

struct Foo {
template <typename T>
void hello(T&) {...}
};
int main() {
std::cout << can_hello<Foo&, int&>::value << '\n';
std::cout << can_hello<Foo&, char&>::value << '\n';
std::cout << can_hello<Foo&>::value << '\n';
}

打印 110。

live example .

关于c++ - 使用 SFINAE 检测模板化成员函数的存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37552637/

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