gpt4 book ai didi

没有 void_t 的 C++ 检测习惯用法

转载 作者:太空狗 更新时间:2023-10-29 20:21:21 26 4
gpt4 key购买 nike

我如何实现 C++ detection idiom不使用 void_t?换句话说,我可以仅使用 C++03 功能实现 C++17 std::is_detected 等吗?

UPD 根据定义,检测习语需要 C++11。在我的问题中,我只是想在没有 void_t 的情况下以某种方式实现 is_detected。我的问题在于:别名模板中未使用的参数不能保证确保 SFINAE 并且可以忽略,ans VS 2013 有这个缺陷;另一个尝试(比如在 cppreference 上)导致编译器崩溃(是的,cl 是世界上最伟大的编译器)。

UPD2 我认为 VS 2013 可以破解任何 C++ 元编程技术(以及程序员的大脑)。

最佳答案

回到过去的 时代,我们就是这样做的

template<typename T>
T declval();

template<typename T>
struct can_foo
{
typedef char yes;
struct no {char c[2];};

template<typename U>
static yes check(int (*)[sizeof(declval<U>().foo(), 1)]);
template<typename>
static no check(...);

enum {value = sizeof(check<T>(0)) == sizeof(yes)};
};

struct fooer
{
void foo() {}
};
struct barer
{
void bar() {}
};

#include<cassert>

int main()
{
assert(can_foo<fooer>::value);
assert(!can_foo<barer>::value);
}

Live example

诀窍是尽可能地滥用 sizeof

请注意,declval 不同于 std::declval

关于没有 void_t 的 C++ 检测习惯用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44399822/

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