SFINAE有问题。我需要能够确定Type是否定义了成员函数operator->而不管其返回类型。示例如下。测试器中的这个类。它定义了返回类型为X*的operator->()。因此,我将不知道“X”是什么以在任何地方对其进行硬编码。templateclassPointerX{...X*operator->()const;...}此类尝试确定传入的T是否定义了方法operator->;不管operator->的返回类型是什么。templatestructHasOperatorMemberAccessor{templatestaticRGetReturnType(R(C::*)()cons
我正在花一些时间学习如何在C++中使用模板。我从没用过之前,我并不总是确定在不同情况下可以实现什么或不能实现什么。作为练习,我包装了我在事件中使用的一些Blas和Lapack函数,我目前正在包装?GELS(计算线性方程组的解)。Ax+b=0?GELS函数(仅适用于实数值)有两个名称:SGELS,对于单精度vector和DGELSdouble。我对界面的想法是一个函数solve这样:conststd::size_trows=/*numberofrowsforA*/;conststd::size_tcols=/*numberofcolsforA*/;std::arrayA={/*value
我正在尝试结合thisanswer中使用的方法用于检测一个类是否有成员变量x与thisanswer根据使用enable_if选择不同的实现.基本上,我想写一个特征类,给定一个类型T,提供对成员T::x的访问如果存在,则提供默认值。以下代码无法在g++上编译:(CompilerExplorer)#include#include//classeswith/withoutxmemberstructWithX{staticconstexprintx=42;};structWithoutX{};//traittodetectxtemplatestructHasX:std::false_type{
如果特定表达式的格式不正确,使用SFINAE可以很容易地隐藏特定的函数重载。但我想做相反的事情,当且仅当给定表达式格式正确时隐藏重载,并以非常通用的方式这样做。我有一个在clang3.5.0和gcc5.2.0中工作的解决方案,但我对任何评论和替代方案感兴趣。理想情况下,会有一个内置的constexprbool函数/宏会在编译时告诉我们特定表达式的格式是否正确。IS_WELL_FORMED(declval()())//Iwantthisasbool可用于enable_if启用或禁用重载。我找到了一个解决方案,但我在g++5.2.0和clang3.5.0中遇到了一些奇怪的行为,我想知道是否
我想知道这段有效代码之间有什么区别:#include#includetemplateusingis_ref=std::enable_if_t,bool>;templateusingis_not_ref=std::enable_if_t,bool>;template=true>voidfoo(T&&){std::cout=true>voidfoo(T&&){std::cout还有这个不起作用:#include#includetemplateusingis_ref=std::enable_if_t,bool>;templateusingis_not_ref=std::enable_if_t
我已经写了我对is_default_constructible的C++03兼容实现的尝试:templatestructis_default_constructible;templatestructis_default_constructible{protected://Putbasetypedefsheretoavoidpollutionstructtwoc{chara,b;};templatestructtest{typedefchartype;};templatestaticTdeclval();};templatestructis_default_constructible::t
我最近在void_t属性检测和protected/私有(private)类信息方面遇到了clang和gcc之间的一些不同行为。考虑如下定义的类型特征:#includetemplateconstexprconstboolhas_nested_type_v=false;templateconstexprconstboolhas_nested_type_v>=true;给定具有protected或私有(private)嵌套type类的示例类型和一个简单的程序#include"has_nested_type.hpp"#includestructProtected{protected:struc
考虑这样一种情况,其中需要使用内部的另一个模板g(例如,可能是一些enable_if表达式)验证类型T另一个模板的虚拟参数,如下所示:templatestructg{typedefvoidtype;};templatestructf{};templatestructf{};//CaseAtemplatestructf::type>{};//CaseBintmain(){ftest;}在这里,为了简单起见,g并没有真正做任何事情。CaseB中的第二个参数处于非演绎上下文中,因此直觉上人们会认为CaseB比CaseA更专业。可悲的是,gcc和clang都会提示模板在上面的实例化中不明确。如
我正在尝试创建一个事件管理器来注册接收者。为此,我希望能够构造一个具有给定参数的std::function。但是,我希望最终用户能够轻松理解该错误。我考虑过使用SFINAE和依赖于类型的static_assert来执行此操作,但我遇到了麻烦,因为这两个函数在有效输入上变得不明确。此外,我希望用户可以收到多个错误原因。由于有两个失败点(提供无效的仿函数和提供错误的事件类型),我希望总共有3个函数,第一个是正确输入的函数,然后是不正确的输入(而不是有4个函数用于每个状态的组合)。这可以用c++17的ifconstexpr解决,但我的目标平台是c++14,所以需要使用其他方法。我目前的尝试(
我已经阅读了有关此的各种权威,包括Dewhurst却对这个看似简单的问题一无所获。我想做的是调用C++functionobject,(基本上,任何你可以调用的东西,一个纯函数或一个带有()的类),并返回它的值,如果它不是void,否则返回“true”。usingstd:structFoo{voidoperator()(){coutboolmagicCallFunction(Functorf){returntrue;//Lotsoftemplatemagicoccurshere//thatresultsinthefunctorbeingcalled.}intmain(intargc,ch