sfinae 相关问题

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

通过sfinae

[注意:我被C ++ 17。] 我有一个类模板,该模板是在相当多的类型(〜25)上实例化的。 其中一些可以彼此正确转换,我想

回答 1 投票 0

为什么在用enable_if定义的模板中添加“* = nullptr”,避免了函数的重载?

考虑此代码: #include #include #include 结构A { int a; }; struct b { std :: string b; }; 模板 auto has_member_a ...

回答 1 投票 0

检查c++中是否存在模板函数

#包括 模板 结构分配器特征{ 私人的: 模板 静态自动 malloc(int) -> decltype(static_cast #include <type_traits> template <typename Allocator> struct AllocatorTraits { private: template <typename U> static auto malloc(int) -> decltype(static_cast<void* (U::*)(size_t)>(&U::malloc), std::true_type()); template <typename> static std::false_type malloc(...); template <typename U, typename T, typename... Args> static auto allocate(int) -> decltype(static_cast<T* (U::*)(Args...)>(&U::template allocate<T, Args...>), std::true_type()); template <typename> static std::false_type allocate(...); public: static constexpr bool has_malloc = decltype(malloc<Allocator>(0))::value; template <typename T, typename... Args> static constexpr bool has_allocate = decltype(allocate<Allocator, T, Args...>(0))::value; }; class TestClass { public: void* malloc(size_t size) noexcept { return nullptr; } template <typename T, typename ...Args> T* allocate(Args &&...args) noexcept { return nullptr; } }; static constexpr bool test_malloc = AllocatorTraits<TestClass>::has_malloc; static constexpr bool test_allocate = AllocatorTraits<TestClass>::has_allocate<int>; 我正在使用 C++20。如果我注释非模板 TestClass 函数,则效果很好,因此注释掉 TestClass::malloc 将导致 test_malloc 为 false。如果我注释掉模板函数,这将无法编译 TestClass::allocate (error C2672: 'AllocatorTraits<TestClass>::allocate': no matching overloaded function found). 任何人都可以帮助我让它按预期工作吗? 既然可以使用C++20,就定义一个概念吧。它们比尝试使用 SFINAE 更方便。 #include <cstdint> #include <type_traits> #include <utility> template <typename T, typename Ret, typename... Args> concept has_allocate = requires(T x, Args... args) { { x.template allocate<Ret>(std::forward<Args>(args)...) } -> std::same_as<Ret*>; }; class HasAllClass { public: void* malloc(std::size_t) noexcept { return nullptr; } template <typename T, typename... Args> T* allocate(Args&&...) noexcept { return nullptr; } }; class Foo { }; static_assert(has_allocate<HasAllClass, int>); static_assert(!has_allocate<Foo, int>); https://godbolt.org/z/KaT6813s1

回答 1 投票 0

如何在 C++ 中以元组形式获取构造函数参数类型?

无法检索元组中的构造函数参数。 我试图将给定类的构造函数参数类型提取为 std::tuple。例如,如果我有一个这样的课程: 结构 MyClas...

回答 1 投票 0

C++ (03) SFINAE 方面编译器独立吗?

我有一个头文件,其功能在很大程度上依赖于SFINAE的成功。在目前的 g++ 4.6 中,它按预期工作。我是否应该假设,我的代码将以同样的方式无缝运行......

回答 2 投票 0

std::enable_if 方法可以在类之外定义吗

是否存在允许在类外部定义 method1 的语法,或者这对 SFINAE 不友好? #包括 模板 结构样本类{ // 这个

回答 1 投票 0

如何在编译时检查是否存在接受给定参数类型的全局范围函数?

我(我认为)需要什么 如何定义一个类型特征来检查对于类型 T 是否声明了函数 ::foo(T) ? 我发现很难的是以 SFINAE 友好的方式拥有 ::foo 。例如...

回答 1 投票 0

是否有一个C++20概念,当使用某个库中的函数时会调用该概念?

我希望对某个库中的函数的所有调用都包含对我的函数的调用。 例如,每当调用库 中的函数时,我的函数 log() 都是...

回答 1 投票 0

禁用 void 类型的类模板成员?

考虑以下基本类模板: #包括 模板< typename T > A类{ 民众: A() = 默认值; T 对象; 模板< typename U = T, type...

回答 3 投票 0

从 C++03 中的模板类中删除函数

我被 C++03 编译器困住了,并试图从(智能指针)模板类中消除“void”类型的函数。 MRE(从课程中删除所有非必要信息): 温度...

回答 1 投票 0

为什么SFINAE中使用void_t?

我打算将我的问题作为以下问题的后续:我们如何将 void_t 用于 SFINAE?我明白了 void_t 是如何使用的。我不明白为什么有必要。 让我们以那个问题为例...

回答 1 投票 0

当所有模板参数均为同一类型时的部分模板特化

在 C++14 中是否可能(因此没有约束、require 或折叠表达式,但有 SFINAE)对类模板进行部分模板特化 模板 基因类...

回答 1 投票 0

如何正确去除模板函数中的代码重复

我有这样的代码(类似“太空飞船”的运算符)。 模板 int 比较器(const T &a, const T &b){ 如果(a< b){ return -1; }else if (a >b){

回答 3 投票 0

为什么混合通用参考和 SFINAE 不起作用

有人可以帮助我理解为什么下面的代码无法编译。 #包括 #包括 模板 无效 foo(T &&va...

回答 1 投票 0

如何确定模板专业化是否存在

我想检查是否存在某种模板专门化,其中未定义一般情况。 鉴于: 模板 结构 A; // 通用定义未定义 圣殿...

回答 2 投票 0

一种编译时方法来测试模板参数 T 是否定义了自己的(静态)方法,而不考虑 T 的基类定义的方法

我在代码中使用静态类版本 CRTP(奇怪的重复模板模式)。那是: // 使用 CRTP 的基类模板 模板 基类{ 民众: // 静态

回答 1 投票 0

检查会员是否存在

这就是我想做的: 模板 结构模型 { 矢量 顶点; #if T 有一个 .normal 成员 无效变换(矩阵 m ) {

回答 8 投票 0

C++ 标准中声明模板参数推导的类型推导失败不是错误 (SFINAE) 的确切引用是什么?

以下来自 CPPreference 的引用很清楚: 此规则适用于函数模板的重载解析期间:当用显式指定或推导的类型替换模板参数时...

回答 1 投票 0

在构造函数中使用SFINAE,检查成员类型的构造函数是否存在

#包括 #包括 结构体A { A(整数){} }; 模板 auto make_A(const Args&... args) -> decltype(A(args...)) { 返回 A(ar...

回答 1 投票 0

为什么自动变体与(等效?)函数的模板版本相比不起作用?

我正在开发一个 C++ 项目,我想将事件分派到不同的模块。我有一个基本事件类和几个派生事件类型(EventA、EventB、EventC)。我的模块继承自临时...

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.