草庐IT

c++ - 带有 std::ostream 的 declval 表达式(用于 SFINAE)

我正在尝试创建一个类型特征类来确定特定类型T可以通过进行流式传输std::ostream的运算符.我使用的是简单的SFINAE技术。最终,我尝试评估替换失败的表达式是:decltype(std::declval()());我的期望是,给定一个实例t类型T和std::ostream实例os,如果表达式os格式不正确,则应发生替换失败。但无论类型如何T显然都不会出现替换失败。.即使我只是声明typedef使用上述decltype表达式,在SFINAE的上下文之外,它可以愉快地编译,即使T不能与std::ostream一起使用.例如:structFoo{};intmain(){//Thisc

c++ - 带有 enable_if : make default implementation 的部分模板函数特化

使用C++11的enable_if我想为一个函数定义几个专门的实现(例如,基于参数的类型)以及一个默认实现。正确的定义方式是什么?以下示例无法按预期工作,因为调用了“通用”实现,无论T类型如何。#includetemplatevoiddummy(Tt){std::cout::value>::type>voiddummy(Tt){std::cout::value>::type>voiddummy(Tt){std::cout我的最小示例中的一个解决方案是使用明确声明“通用”实现不适用于整数或浮点类型std::enable_if::value&&!std::is_floating_point

c++ - 带有 enable_if : make default implementation 的部分模板函数特化

使用C++11的enable_if我想为一个函数定义几个专门的实现(例如,基于参数的类型)以及一个默认实现。正确的定义方式是什么?以下示例无法按预期工作,因为调用了“通用”实现,无论T类型如何。#includetemplatevoiddummy(Tt){std::cout::value>::type>voiddummy(Tt){std::cout::value>::type>voiddummy(Tt){std::cout我的最小示例中的一个解决方案是使用明确声明“通用”实现不适用于整数或浮点类型std::enable_if::value&&!std::is_floating_point

c++ - 在通用 lambda 中使用 `if constexpr` 访问成员类型需要两个分支的格式都正确 - gcc 与 clang

考虑两个具有不同成员类型别名的struct:structfoo{usingx=int;};structbar{usingy=float;};在template上下文中给定一个T,我想获得T::x或T::y取决于T是什么:templateautos(){autol=[](autop){ifconstexpr(p){returntypenameT::x{};}else{returntypenameT::y{};}};returnl(std::is_same{});}intmain(){s();}g++编译上面的代码,而clang++产生这个错误:error:notypenamed'y'in

c++ - 在通用 lambda 中使用 `if constexpr` 访问成员类型需要两个分支的格式都正确 - gcc 与 clang

考虑两个具有不同成员类型别名的struct:structfoo{usingx=int;};structbar{usingy=float;};在template上下文中给定一个T,我想获得T::x或T::y取决于T是什么:templateautos(){autol=[](autop){ifconstexpr(p){returntypenameT::x{};}else{returntypenameT::y{};}};returnl(std::is_same{});}intmain(){s();}g++编译上面的代码,而clang++产生这个错误:error:notypenamed'y'in

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

假设我定义了一个zero_initialize()函数:templateTzero_initialize(){Tresult;std::memset(&result,0,sizeof(result));returnresult;}//usage:autodata=zero_initialize();为某些类型调用zero_initialize()会导致未定义的行为1,2。我目前正在强制执行T来验证std::is_pod.随着该特性在C++20中被弃用以及概念的出现,我很好奇zero_initialize()应该如何发展。什么(最小)特征/概念可以保证memsetting对象的定义明确?

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

假设我定义了一个zero_initialize()函数:templateTzero_initialize(){Tresult;std::memset(&result,0,sizeof(result));returnresult;}//usage:autodata=zero_initialize();为某些类型调用zero_initialize()会导致未定义的行为1,2。我目前正在强制执行T来验证std::is_pod.随着该特性在C++20中被弃用以及概念的出现,我很好奇zero_initialize()应该如何发展。什么(最小)特征/概念可以保证memsetting对象的定义明确?

c++ - 模板类中方法的部分特化

给定:structA{virtualboolwhat()=0;};templatestructB:publicA{virtualboolwhat();};我想部分专门化what之类的:templateboolB::what(){returntrue;}templateboolB::what(){returnfalse;}但这似乎是不可能的(在C++11中?)所以我尝试了SFINAE:templatetypenamestd::enable_if::value,bool>::typeB::what(){returntrue;}templatetypenamestd::enable_if::

c++ - 模板类中方法的部分特化

给定:structA{virtualboolwhat()=0;};templatestructB:publicA{virtualboolwhat();};我想部分专门化what之类的:templateboolB::what(){returntrue;}templateboolB::what(){returnfalse;}但这似乎是不可能的(在C++11中?)所以我尝试了SFINAE:templatetypenamestd::enable_if::value,bool>::typeB::what(){returntrue;}templatetypenamestd::enable_if::

c++ - SFINAE 适用于扣除但因替代而失败

考虑以下MCVEstructA{};templatevoidtest(T,T){}templateclassWrapper{usingtype=typenameT::type;};templatevoidtest(Wrapper,Wrapper){}intmain(){Aa,b;test(a,b);//workstest(a,b);//doesn'tworkreturn0;}这里test(a,b);作品和test(a,b);失败::11:30:error:notypenamed'type'in'A'usingtype=typenameT::type;~~~~~~~~~~~~^~~~:2