首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么SFINAE在这个例子中不能工作?

SFINAE(Substitution Failure Is Not An Error)是C++模板元编程中的一种技术,用于在编译时根据类型特征进行函数重载和模板特化的选择。然而,在某些情况下,SFINAE可能无法正常工作。

在这个例子中,无法使用SFINAE的原因可能是以下几点:

  1. 语法错误:代码中可能存在语法错误,导致编译器无法正确解析模板参数或函数声明。这可能包括缺少分号、括号不匹配等问题。在这种情况下,需要仔细检查代码并修复语法错误。
  2. 模板参数不满足要求:SFINAE依赖于模板参数的特征来进行函数重载或模板特化的选择。如果模板参数不满足所需的特征,SFINAE将无法正常工作。例如,如果模板参数不具备所需的成员函数或类型别名,SFINAE将无法选择正确的函数或模板特化。在这种情况下,需要检查模板参数是否满足要求,并根据需要进行修改。
  3. 模板参数推导失败:模板参数推导是确定模板参数的过程,如果推导失败,SFINAE也无法正常工作。模板参数推导可能受到函数调用的上下文、模板参数的默认值或其他模板参数的影响。在这种情况下,需要检查函数调用的上下文是否正确,并确保模板参数能够成功推导。

总结起来,SFINAE在这个例子中不能工作可能是由于语法错误、模板参数不满足要求或模板参数推导失败等原因导致的。需要仔细检查代码,并根据具体情况进行修复。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ABAP 泛型编程(Generic Programming) 在实际工作的一例子

在 ABAP ,泛型编程主要通过使用类型组(Type Groups)和泛型类型(Generic Types)来实现。类型组允许您定义一组相关的类型,而泛型类型允许您编写独立于特定类型的代码。...类型组提供了一种定义类型别名和常量的方法,以便在整个程序重复使用。 泛型类型(Generic Types):泛型类型是一种表示不确定类型的方法。...在 ABAP ,泛型类型通常用 TYPE ANY 或 TYPE ANY TABLE 表示。您可以使用泛型类型编写独立于特定类型的函数、方法和类。...我们来看现实工作中一实际的例子。 Attachment 的metadata里定义的data type和runtime时的data type不一样 Attachment和其他四节点不太一样。...我已经想到有两种办法可以工作,等做完性能测试后再update大家。 不知道BP是否也要实现类似的需求,如果是,等我把solution写出来之后再和他们的比较。

19620

C++那些事之SFINAE

c++ 98的解决方案依赖于3关键概念:重载解析、SFINAE和sizeof的静态行为。...您可能还想知道为什么不能与继承一起使用。C ++的继承和动态多态性是一在运行时可用的概念,换句话说,就是编译器将不会拥有且无法猜测的数据!...lambda具有以下语法: [capture-list](params) -> non-mandatory-return-type { ...body... } 在我们的例子,一有用的例子是: int...我们有一工作是有效的,我们可以使用它的序列化! 如果我和我的SFINAE技巧一样邪恶,我会让你复制每个代码片段来重新创建一完整的工作解决方案。但今天,万圣节的精神与我同在,这里是要点。嘿,嘿!...(1)首先,如果您希望有一与Boost一起工作的解决方案。

2.1K20

C++设计模式之SFINAE:用来检测类是否有某个成员函数

针对类特定成员函数的检测其实在工作也可能用到。C++可以用SFINAE技巧达到这个目的。...SFINAE是Substitution Failure Is Not An Error的缩写,直译为:匹配失败不是错误。属于C++模板编程的高级技巧,但属于模板元编程的基本技巧。...在这个过程,我发现有些常见的SFINAE写法是有问题的,下面探讨一下。 举个例子,我们来check一下C++标准库的类中有没有push_back()成员函数。...两Helper类的模板参数。第二参数为 push_back的函数指针类型。之所以弄了两Helper,是因为std::string的push_back的参数为char。...将上面的代码改变成宏的版本,push_back作为宏的一参数,即可。 我这里为什么用push_back()举例呢?

3.2K20

现代C++之SFINAE

c++ 98的解决方案依赖于3关键概念:重载解析、SFINAE和sizeof的静态行为。...您可能还想知道为什么不能与继承一起使用。C ++的继承和动态多态性是一在运行时可用的概念,换句话说,就是编译器将不会拥有且无法猜测的数据!...lambda具有以下语法: [capture-list](params) -> non-mandatory-return-type { ...body... } 在我们的例子,一有用的例子是: int...我们有一工作是有效的,我们可以使用它的序列化! 如果我和我的SFINAE技巧一样邪恶,我会让你复制每个代码片段来重新创建一完整的工作解决方案。但今天,万圣节的精神与我同在,这里是要点。嘿,嘿!...(1)首先,如果您希望有一与Boost一起工作的解决方案。

2.9K20

C++雾中风景18:C++20, 从concept开始

群里的一问题 SFINAE 熟悉C++模板编程的小伙伴肯定第一时间想到通过SFINAE的方式来解决,让笔者来解决这个问题的话,会写出下面的代码: template T test...,Cal代表着一concept的实现,requires花括号的内容就代表了对于类型T的约束,要满足下面的操作符 a + a; a - a; a * a; a / a; Bingo!...How to use concept的定义 这里写了一例子,咱们基于这个例子来展开: template concept Cal = requires (T a) {...(真搞不懂搞这么多写法干什么,不能统一一下吗?...而很多时候我们使用它需要 要进行模板推断类型的编程设计 利用SFINAE的方式来类型约束 这无形之中增加Coding时的心智成本,而concept作为一新的语法糖,给了我们拆分二者的机会:让上帝归上帝

58730

C++雾中风景18:C++20, 从concept开始

image.png 群里的一问题 SFINAE 熟悉C++模板编程的小伙伴肯定第一时间想到通过SFINAE的方式来解决,让笔者来解决这个问题的话,会写出下面的代码: template <typename...,Cal代表着一concept的实现,requires花括号的内容就代表了对于类型T的约束,要满足下面的操作符 a + a; a - a; a * a; a / a; Bingo!...How to use concept的定义 这里写了一例子,咱们基于这个例子来展开: template concept Cal = requires (T a) {...(真搞不懂搞这么多写法干什么,不能统一一下吗?...而很多时候我们使用它需要 要进行模板推断类型的编程设计 利用SFINAE的方式来类型约束 这无形之中增加Coding时的心智成本,而concept作为一新的语法糖,给了我们拆分二者的机会:让上帝归上帝

1K00

C++17一很冷门很有意思的新特性

>using void_t = void; 看着它很简单,但它搭配SFINAE却可以在模板元编程中发挥巨大作用。...你的简历不要写这些信息哦! HR 开价 20K,如何谈到 27K?...哈哈哈,发年终奖啦,我要去斗鱼打赏最喜欢的妹子~ 大厂,那高高的围墙 来看一看两道大厂面试场景题 大厂伤我千百遍,我待大厂如初恋 给工作 4 年迷茫的程序员们的一点建议 『腾讯后台开发』实习生技能要求...Java 为什么不采用 360 垃圾清理来进行垃圾回收呢? 如果一定要在 C++ 和 Java 中选择,是选 C++ 还是 Java ? C++面试应该准备哪些技能点?分别能达到什么薪资水平?...一 WebSocket 服务器是如何开发出来的? 从零实现一 http 服务器 使用 epoll 时需要将 socket 设为非阻塞吗?

60710

C++奇淫巧技之SFINAE

SFINAE 技术,即匹配失败不是错误,英文Substitution Failure Is Not An Error,其作用是当我们在进行模板特化的时候,会去选择那个正确的模板,避免失败 看具体的例子...,但是由于我们不知道multiplication_result,根据 Substitution Failure Is Not An Error ,于是我们就去选择函数 multiply 这种技术在代码的一大的用途就是在编译时期来确定某个...is_ptr函数,3是接受不同的指针参数,另一则包括了其他的所有参数, IntPtr 是一变量指针 FooMemberPtr 是一成员属性指针 FuncPtr 是一函数指针 接着我们来看下...muduo 库的一段代码: template struct has_no_destroy { template static char...其作用主要是判断是否有no_destroy,并且在继承上也成立,但是继承在不同的gcc版本上不一定成立,具体可以看:http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions

50930

现代C++之SFINAE应用(小工具编写)

现代C++之SFINAE应用(小工具编写) 0.导语 现在考虑这个输入: map mp{ {1, 1}, {2, 4}, {3, 9}...pair C++ STL容器有很多,例如:map,vector等等,我们想要针对键值对的map输出如下格式: key => value 针对不是键值对的采用下面输出: (a, b) 在C++ STL针对...; static constexpr bool value = decltype(output(nullptr))::value; }; 这里再提一下,当容器不能直接输出的时候...,也就是第一函数在std::declval() << *ptr会出错,但是在真正报错之前会去检测是否有重载函数,发现后面还有output函数,最后决议不报错,这便是SFINAE...下面原理还是SFINAE来实现的,当不是pair的时候就调用第二重载函数了,否则就是第一

1.1K20

C++20初体验——concepts

concept不能单独声明,所以不会出现两concept相互引用的情况。下一节将介绍的四种约束,concept一不能有。...GoodMeowableCat got its is_meowable from Meowable } 如果Meowable,那么一定有is_meowable,所以BadMeowableCat也满足,为什么不能判断出...在上面的例子,编译器认为BadMeowableCat的is_meowable和Meowable的那个不一样,从而两concept之间没有包含关系,于是f1的重载决议就是二义的;而GoodMeowableCat...以下例子来自meds::function,是我为一华丽而无用的单片机项目写的库。 Tag Dispatching 首先是还讲点道理的tag dispatching。...的模板类型发生错误,根据SFINAE,该重载被忽略;与此同时第二是可用的。

1.3K10

C++11:如何判断一类是另一模板类的子类?

https://blog.csdn.net/10km/article/details/50845588 我有一模板类memory_cl,我需要判断另一类是否为它的子类,怎么实现呢...开始我问了度娘,在知乎上找到了答案 —>《如何判断一类是否为一模板类的实例?》...上面这个链接给出了完整的答案: struct is_kind_of_ { template class TM, class T> static std::true_type...is_kind_of_::check(std::declval())) 经过测试,确实是有效的,但是只是在gcc(我用的是5.2.0版本)编译器下有效, 但在VS2015下编译是不能通过的...,VS2015虽然几乎支持了所有C++11的特性,但还有两三个特性没有支持,这其中就包括”表达式 SFINAE”,上面这个方法在VS2015下编译报错大概就是载在这个坑里了。

2.6K10

C++模版的本质

用户很难通过配置去实现一辆车设计,不好定制化一汽车; 3. 如果有其中一属性有新的变化,就得实现一新类,扩展代价太大。...举个例子, 以前我们实现通用的排序函数可能是这样: void sort (void* first, void* last, Cmp cmp); 这样的设计有下面一些问题: 1....模板参数在形式上主要包括四类,为什么会存在这些分类,主要是满足不同类对参数化的需求: type template parameter: 类型模板参数,以class或typename 标记;此类主要是解决朴实的参数化类的问题...); 函数模板实例化过程,参数推导不匹配所有的模板或者同时存在多个模板实例满足,或者函数重载决议有歧义等,实例化失败; 为了编译函数模板调用,编译器必须在非模板重载、模板重载和模板重载的特化间决定一无歧义最佳的模板...(模板备选集合)中一匹配,找到最优匹配的模板定义, Failure:在模板集中,单个匹配失败; Error:在模板集中,所有的匹配失败; 所以单个匹配失败,不能报错误,只有所有的匹配都失败了才报错误

1.7K30

C++ 模板沉思录(上)

也就是说,在上例,编译器实际上只实例化出了两函数:string版本的Plus,以及int版本的Minus。 在这里,“懒惰即美德”占了上风。...2.3 SFINAE SFINAE(Substitution Failure Is Not An Error,替换失败并非错误)是一高级模板技巧。...本章,我们以几个经典的Type Traits应用,来见识一番此技术的精妙。 3.1 为T“添加星号” 第一例子较为简单:我们需要得到T的指针类型,即:得到“T *”。...例如上例,为了去除一十级指针的星号,编译器竟然需要实例化出11类!但好在这一切均发生在编译期,对运行效率不会产生任何影响。...接下来,就让我们以一更复杂的例子来继续讨论这一技术的精彩之处:编译期分数的实现。 4.2 编译期分数 分数,由分子和分母组成。

1.3K20

性能优化利器之constexpr

最近在升级系统和进行一些性能优化,业余时间也看一些技术书籍和视频,看了下上次更新文章的时间,大致在一月前了,确实有点久了,所以赶紧拾起来,不能让大伙忘了我不是。...今天,聊聊在升级过程的一比较重要的优化点-编译期优化。 概述 说明符constexpr是自C++11引入,我相信很多人跟我一样,在第一次接触这个的时候,会很容易和const混淆。...自C++17起,引入了if constexpr语句,在本节,将借助SFINAE 和 std::enable_if来实现一简单的Square功能,最后借助if constexpr对代码进行优化(如果对...,因为在代码存在t.value * t.value操作,而对于一int来说并没有value这个变量,所以编译失败。...在上述代码,为了编译成功,我们引入了两Square()模板函数借助std::enable_if来实现,代码上多少有点冗余,在这个时候,本节的主角if constexpr 出场,完整代码如下: #include

28310
领券