- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 C++17 中,我们有 std::void_t
,这让 SFINAE 看起来更漂亮:
template <typename T>
std::void_t<decltype(T::prop)> foo() { /* stuff */ }
只有 T::prop
存在,模板函数才会存在。
如果 T::prop
存在,模板函数 foo()
将等同于:
template <typename T>
void foo() { /* stuff */ }
否则,代码相当于根本没有声明foo()
。
对于标准库中的其他类型,std::void_t
是否有任何泛化,例如:
template<typename T, typename...>
using generic_t = T;
以便下面的代码有效?
template <typename T>
std::generic_t<int, decltype(T::prop)> foo() { /* stuff */ }
相当于
template <typename T>
int foo() { /* stuff */ }
如果 T::prop
存在?
最佳答案
为什么您需要这样的概括? void_t
有点特别,因为它可以帮助您轻松编写类型特征,因为您可以拥有一个默认为 void
的主要类型和一个使用 void_t 的特化
。例如:
template <class T, class = void>
struct has_prop : std::false_type { };
template <class T>
struct has_prop<T, std::void_t<decltype(T::prop)>> : std::true_type { };
并不是说 void
有什么特别之处,您只需要在主要和特化之间达成一些一致的类型。
void_t
如果您只是直接在 SFINAE 中使用它,则意义不大。您可以将表达式粘贴到其他地方:
template <typename T, class = decltype(T::prop)>
void foo() { /* stuff */ }
此时返回类型与您正在检查的条件完全不同,所以如果您想要 int
:
template <typename T, class = decltype(T::prop)>
int foo() { /* stuff */ }
关于c++ - 是否有其他类型的 void_t 的标准概括?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44715756/
我正在尝试练习 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 。在他的演
我是一名优秀的程序员,十分优秀!