- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我如何实现 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);
}
诀窍是尽可能地滥用 sizeof
。
请注意,declval
不同于 std::declval
。
关于没有 void_t 的 C++ 检测习惯用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44399822/
我正在尝试练习 void_t 的用法,但以下代码给出了编译错误。 is_fun 是 CompS 结构中的 typedef,所以我认为 Comp::is_fun 应该是有效的。 我在这里遗漏了什么吗?
我在 Cppcon14 上观看了 Walter Brown 关于现代模板编程(Part I,Part II)的演讲,他展示了他的 void_t。 SFINAE 技术。 示例: 给定一个计算结果为 vo
最近我尝试编写围绕 void_t 的包装器,如下所示: namespace detail { template struct applicable : std::false_type {}; tem
这个问题在这里已经有了答案: How does `void_t` work (3 个答案) 关闭 7 年前。 我有一个关于 void_t 元函数的问题,在这个视频中显示 https://www.yo
我尝试运行以下代码,它应该依赖于 void_t技巧,应该选择更专业的类模板(在本例中是第二个) #include #include template using void_t = void; t
我需要帮助的第一件事是解决下面的歧义。但是一旦歧义消失,我仍然需要知道是否有更简洁优雅的方式来实现 8 个特化。 #include template using void_t = void; te
考虑以下代码: template > struct is_invokable : std::false_type {}; template struct is_invokable>> : std::
cppreference 上有一个关于使用别名的例子。此示例失败,因为 int 没有成员 foo: template using void_t = void; template void_t f();
当我第一次学习如何检查类中的特定签名时,我被教导使用 std::void_t 并编写如下代码: template class HAS:public false_type{}; template cla
此刻,我是 using this method to check if a class has a method with a specific signature. 参加后Walter E. Bro
对于 C++14 中的成员检测,我使用了基于示例 here 的代码, 但它似乎不起作用。 一个完整的例子: #include template using void_t = void; templ
我想实现一个 has_no_duplicates评估为 std::true_type 的类型特征如果传递的可变类型列表没有重复类型。 static_assert(has_no_duplicates{}
在 C++17 中,我们有 std::void_t,这让 SFINAE 看起来更漂亮: template std::void_t foo() { /* stuff */ } 只有 T::prop 存
我在以下代码中得到了意外结果(第二个 static_assert 失败): #include template struct is_bananas : std::false_type {}; te
下面是试图在编译时检查默认构造函数是否存在的代码段。编译这个 clang version 11.0.0 Target: x86_64-apple-darwin19.6.0 Thread model:
我正在学习模板元编程,最近,我看到了关于 CPPConference 的演讲。关于 void_t。不久之后,我发现了detection idiom . 但是,我仍然很难理解其中任何一个(尤其是检测习惯
#include template struct IsIterator final : std::false_type {}; template struct IsIterator::iterato
前几天我遇到了这个。 #include #include using namespace std; template struct make_void { typedef void type; }
我如何实现 C++ detection idiom不使用 void_t?换句话说,我可以仅使用 C++03 功能实现 C++17 std::is_detected 等吗? UPD 根据定义,检测习语需
我在看Walter Brown's CppCon2014 talk on template metaprogramming的第二部分,期间他讨论了他的小说void_t<>的用途 build 。在他的演
我是一名优秀的程序员,十分优秀!