sfinae 相关问题

替换失败不是错误。这是一种C ++编程技术,允许模板验证有关其模板参数的属性,从而允许在某些类型的对象可用时使用不同的特化。

如何检查一个类是否有一个或多个具有给定名称的方法?

检查类 Foo 是否有名为 bar 的方法有许多不同的技巧。例如: 如果我们关心方法签名,我们会围绕类似 std::void_t<

回答 0 投票 0

如何在 C++ 中制作模板函数来定义任何类型的位表示

模板 std::string bit_representation(T &&type) { uint8_t 数据[sizeof(T)]; 如果 constexpr (std::is_copy_constructible_v) { T tmp(类型); 标准::

回答 1 投票 0

C++ 模板特化如何使用默认布尔值?

我正在查看 libc++ 的代码,我注意到了这个片段: // __指针 _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_pointer, 指针); 模板 我正在查看 libc++ 的代码,我注意到了这个片段: // __pointer _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_pointer, pointer); template <class _Tp, class _Alloc, class _RawAlloc = __libcpp_remove_reference_t<_Alloc>, bool = __has_pointer<_RawAlloc>::value> struct __pointer { using type _LIBCPP_NODEBUG = typename _RawAlloc::pointer; }; template <class _Tp, class _Alloc, class _RawAlloc> struct __pointer<_Tp, _Alloc, _RawAlloc, false> { using type _LIBCPP_NODEBUG = _Tp*; }; 让我疑惑的是这一行: bool = __has_pointer<_RawAlloc>::value 这段代码的语义非常清楚:这里我们调用一个元函数__has_pointer,如果它为真,我们就使用__pointer的第一个实现,如果不是,我们就使用第二个(显式为假的那个)在其模板参数中)。我很困惑,因为我不明白这是如何工作的,第一个实例不应该在其模板参数中有一个明确的true然后模板专业化开始吗?如果是这样,那么我们需要在启动此模板时调用元函数,所以也许bool = __has_pointer<_RawAlloc>::value>是它的简写?我想知道这里使用了什么样的机制才能允许这样做。用于使这项工作的规则是什么? _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX的完整实现可以在这里找到: #define _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(NAME, PROPERTY) \ template <class _Tp, class = void> struct NAME : false_type { }; \ template <class _Tp> struct NAME<_Tp, __void_t<typename _Tp:: PROPERTY > > : true_type { } 第一个实例不应该在其模板参数中有一个明确的 true 然后模板专业化开始吗? 首先,您定义一个模板。如果您尝试实例化一个模板,就会得到这个“基本”模板。 然后你可以定义一个专业化。如果模板参数与专业化匹配,那么您将获得专业化模板。惊喜! template <class _Tp, class _Alloc, class _RawAlloc = __libcpp_remove_reference_t<_Alloc>, bool = __has_pointer<_RawAlloc>::value> struct __pointer 让我们忽略专业化。如果没有专门化,这是您在实例化此模板时将获得的模板。这就是当最后一个模板参数是 true 或 false 时得到的结果。没关系。这是你的模板。好好享受。祝你胃口好 但是等等,你忘了:你也有专长。别急:如果最后一个模板参数是false,你的餐点就是专业化。 但是,如果最后一个模板参数原来是true没有任何变化,你仍然得到原始模板。其他地方都不需要设置为“显式真实”。 话虽如此,是的,您实际上可以通过 two 专业化,甚至不定义基本模板,使事情看起来像这样: template <class _Tp, class _Alloc, class _RawAlloc = __libcpp_remove_reference_t<_Alloc>, bool = __has_pointer<_RawAlloc>::value> struct __pointer; template <class _Tp, class _Alloc, class _RawAlloc> struct __pointer<_Tp, _Alloc, _RawAlloc, true> { using type _LIBCPP_NODEBUG = typename _RawAlloc::pointer; }; template <class _Tp, class _Alloc, class _RawAlloc> struct __pointer<_Tp, _Alloc, _RawAlloc, false> { using type _LIBCPP_NODEBUG = _Tp*; }; 这在逻辑上是等价的。这两种选择在逻辑上是等价的。 这只是一个类型特征,用于使用类的部分专业化 分派到特定的实现。有 template <class _Tp, class _Alloc, class _RawAlloc = __libcpp_remove_reference_t<_Alloc>, bool = __has_pointer<_RawAlloc>::value> struct __pointer { using type _LIBCPP_NODEBUG = typename _RawAlloc::pointer; }; 定义了一个初级类模板,模板的bool = __has_pointer<_RawAlloc>::value部分是一个bool非类型tmplate参数,默认为__has_pointer<_RawAlloc>::value的值。 __has_pointer<_RawAlloc>::value 将返回 true 如果 _RawAlloc 有一个 pointer 成员和 false 否则。 接下来我们有 template <class _Tp, class _Alloc, class _RawAlloc> struct __pointer<_Tp, _Alloc, _RawAlloc, false> { using type _LIBCPP_NODEBUG = _Tp*; }; 这是主模板的偏特化,只要最后一个模板参数是false.就会被使用 这意味着当 _RawAlloc 有 pointer 成员时使用主模板,而当它没有时使用专业化

回答 2 投票 0

如何使用 enable_if 来根据迭代器迭代的类型启用模板函数?

我目前有一个看起来像这样的功能: 模板 std::string doit(input_iterator beg, input_iterator end) { static_assert(sizeof(*beg) =...

回答 1 投票 0

选择解析为相似签名的正确模板重载

TL;博士 有没有一种方法可以让我使用 SFINAE 选择函数模板的重载,该函数模板在解析时会产生类型参数的其他等效替换? 更新 按照要求,我

回答 0 投票 0

在 C++ 中出现“模板重新声明中的模板参数过多”错误

我正在尝试使用 std::enable_if 根据传递给它的枚举值有选择地启用类上的函数。这是我目前正在尝试的方式: // 类定义 模板

回答 1 投票 0

SFINAE:使用模板结构的子模板

做这些事情的正确方法是什么? 我想在参数包上使用条件,例如: static_assert(all_of::are_in::value); 总之我有

回答 0 投票 0

为SFINAE测试人员提供默认值零的原因是什么?

我注意到很多 boost 和 libc++/libstdc++ 在代码中明确地为 SFINAE 提供了默认值零,例如 // libc++ http://llvm.org/svn/llvm-project/libcxx/trunk/include/memory 命名空间

回答 2 投票 0

带 enable_if 的过载解决方案

最近,我在面试中被问到这个问题: 以下代码将调用哪个 Vector 构造函数? #包括 类迭代器{ 民众: 迭代器(int &x): ptr_(&am...

回答 2 投票 0

constexpr 类型检查

我正在尝试根据我是否将特征矩阵传递给它们来重载某些函数,并且我想让自己成为一些不错的 constexpr 函数以提高可读性。 为此,我决定...

回答 3 投票 0

带参数包绑定重载模板

我正在使用 pybind11 在 Python 中使用 C++ 代码,我正在努力寻找绑定一些通用模板代码的最佳方法: 类 MyBase { 民众: 使用 Ptr = std::shared_ptr< MyBase >;

回答 0 投票 0

不在直接上下文中的替换失败不会在 C++ 中引发硬错误

我是 C++ 模板的新手,刚刚学习 SFINAE 和 C++ 中的相关功能。 背景和代码 我正在阅读这里的帖子。在那篇文章中,作者试图实现 boost hana 的 is_...

回答 0 投票 0

boost::static_visitor未能将多个不同的可能类型的函数模板专门化。

我试图创建一个访问者函数,将我的boost::variant的值加在一起。我使用模板来处理类型不同的情况,例如int + float typedef boost::...。

回答 1 投票 2

数组向量的C++ SFINAE

我想做一个重载操作符<<,它只被容器(arrayvector)使用。我有以下模板:namespace reachability {模板。 ...

回答 1 投票 0

使用概念对任何具有特定值类型的容器进行C++迭代。

我想把我的模板中所有不和谐的enable_ifs去掉,用C++20的概念来代替,然而几乎没有任何关于概念的信息,而且语法的变化与我的任何源 ...

回答 1 投票 3

如何在方法调用中使用SFINAE有条件地定义一个变量?

我想定义一个模板类IE,它提供了public method().method()调用底层的private run(),它可能会接受与传递给IE的模板参数相关的参数。所以,我想 对于IE来说

回答 1 投票 0

关于函数模板实例化的sfinae。

我想检查一个函数模板是否可以为给定类型实例化。举个例子,对于模板:模板 void f() { T{}; } 我想断言f

回答 1 投票 1

SFINAE内概念模板参数

SFINAE在概念论证里面能用吗?也许这里不叫SFINAE)。例如:模板 需要 std::invocable && /

回答 1 投票 3

SFINAE在这里不适用吗?

我写了一些东西,使用SFINAE在某些条件下不生成函数。当我直接使用元代码时,它能正常工作,但当我通过另一个间接使用该代码时, ...

回答 3 投票 3

只对一个类模板的一个方法进行专门化

我有一个类模板,它可以正确地适用于所有可能的类型T1,T2.模板 class Basic { int a; float b; public: void foo(T1 t1, T2 t2) { ...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.