草庐IT

c++ - 应用 SFINAE 检查是否为 T 定义了特征

我目前正在研究一个小型数学vector类。我想要两个vector类,Vector2和Vector3从一个到另一个是可构造的。例如:Vector2vec2(18.5f,32.1f);//x=18.5;y=32.1Vector3vec3(vec2);//x=18.5;y=32.1;z=float()为此,为了简化可扩展性,我想使用特征VectorTraits其基本定义如下:templatestructVectorTraits{typedefTVectorType;typedeftypenameT::ValueTypeValueType;staticconstunsignedintdimen

c++ - "Conditional"别名模板

在类似非特化模板结构的类型中pointer_traits(即templatestructpointer_traits),存在一个成员别名模板rebind定义为Ptr::rebind,如果存在,否则为其他类型。虽然我已经看到一些关于检查某个成员是否存在的答案,但如何实现一个“条件”别名模板,如pointer_traits::rebind?也就是说,就好像通过以下伪C++:templateusingtype=has_type?int:float;或templateusingtype=if_has_type::type;我考虑过使用类似于https://en.wikibooks.org/wi

C++:SFINAE 区分填充和范围构造函数?

Here是一个询问如何区分填充和范围构造函数的问题。代码复制在这里:templatestructNaiveVector{vectorv;NaiveVector(size_tnum,constT&val):v(num,val){//fillcoutNaiveVector(InputIteratorfirst,InputIteratorlast):v(first,last){//rangecout如该问题中所述,上面的代码不起作用。解决方案是使用SFINAE定义范围构造函数,像这样example:template()))>::type>::value,void>::type>NaiveVe

c++ - SFINAE 构造函数

这个问题在这里已经有了答案:SFINAEworkinginreturntypebutnotastemplateparameter(3个答案)Templatespecializationandenable_ifproblems[duplicate](1个回答)关闭4年前。我一直喜欢这样的SFINAE函数语法,似乎通常运行良好!template::value>::type>T(Integern){//...}但是当我想在同一个类(class)也这样做时遇到了问题......template::value>::type>T(Floatn){//...}出现这样的错误:./../T.h:286

c++ - 如果 constexpr 与 sfinae

随着ifconstexpr的引入在c++17,在c++14中使用编译时SFINAE解决的一些问题/c++11现在可以使用ifconstexpr解决,语法更简单。例如,考虑以下编译时递归的基本示例,以生成打印可变数量参数的子例程。#include#includetemplatevoidprint_sfinae(T&&x){std::coutstd::enable_if_t0)>print_sfinae(T0&&x,T&&...rest){std::cout(rest)...);}templatevoidprint_ifconstexpr(T0&&x,T&&...rest){ifconst

c++ - 这个 has_member 类模板是如何工作的?

我试图了解以下类模板的工作原理(取自here),但我无法正确理解它:templateclasshas_member{classyes{charm;};classno{yesm[2];};structBaseMixin{voidoperator()(){}};structBase:publicType,publicBaseMixin{};templateclassHelper{};templatestaticnodeduce(U*,Helper*=0);staticyesdeduce(...);public:staticconstboolresult=sizeof(yes)==sizeo

c++ - 在某些枚举模板情况下启用类构造函数

出于性能原因,我使用带有枚举的模板化类而不是继承继承(这不是一个选项)。此时我有类似的东西:typedefenum{A,B,C,D}QueueType;templateclassQueue{Queue(inta){...}//onlyusablewhenT=AQueue(unsigneda,unsignedb){...}//onlyusablewhenT=B||T=CQueue(somestructz){...}//onlyusablewhenT=B||T=C//otherconstructors}现在,如果为已定义的T调用不兼容的构造函数,我会在T上使用大量的ifs/switches

c++ - 使用 SFINAE 检测同类继承

我正在尝试编写一个元函数来检查作为可变参数模板参数传递的所有类型是否不同。执行此操作的最高效方法似乎是从一组类继承并检测是否存在错误。问题是以下代码编译失败,而我希望SFINAE可以工作。编辑。问题不是“如何编写该元函数”,而是“我如何捕获双重继承错误并在它发生时输出false_type”。AFAIK,只有SFINAE才有可能。templatestructdummy{};//error:duplicatebasetype‘dummy’invalidtemplatestructfail:dummy,dummy{};templatetrue_typetest(faila=fail());f

C++ 如何使 template<T>f() 为整数 T 返回 -1,为指针类型返回 nullptr

我需要完成以下任务:templatef(){:return{-1ifTisofintegraltype,elsenullptr}}在我的特定用例中,T可以是四种类型之一:intPy_ssize_t//ssize_tPy_hash_t//ssize_tPyObject*//PyObjectissomeCstruct这是我迄今为止最好的解决方案:templateTtest(typenameenable_if::value,void*>::type=nullptr){return-1;}templateTtest(typenameenable_if::value,void*>::type=n

c++ - 是否可以编写 C++ 模板/宏来检查两个函数是否具有相同的签名

是否可以编写C++模板/宏来检查两个函数是否具有相同的签名(返回类型和参数列表)?这是我想如何使用它的一个简单示例:intfoo(conststd::string&s){...}intbar(conststd::string&s){...}if(SAME_SIGNATURES(foo,bar)){//dosomethinguseful...makeQtsignal-slotconnectionforexample...}else{//signaturesmismatch..reportaproblemorsomething...}那么这是有可能的还是只是一个白日梦?附言事实上,我对C+