草庐IT

c++ - 使用 enable_if 的模板特化在 Clang 中失败,适用于 GCC

我正在尝试删除基于模板类型的成员函数。问题是在未删除的情况下,使以后的模板特化与我的函数的类型签名匹配。我尝试了以下代码,它使用GCC(9.0.1)编译,但在Clang(9.0.0)中出错。我认为它也无法在MSVC++中构建代码。#include#includetemplatestructmy_type{templatestd::enable_if_t::value,my_type>my_fun(constmy_type&v){std::couttemplatestd::enable_if_t::value,my_type>my_type::my_fun(constmy_type&v)

c++ - `enable_if` 与 `enum` 模板特化问题

我在GCC编译时遇到问题enable_ifs应用于模板类方法的返回值。使用Clang,我可以在enable_if中使用表达式在enum上模板参数,而GCC拒绝编译此代码。这里是问题描述、初始代码及其后续修改,试图让我和编译器满意(不幸的是,不是同时)。我有一个非模板类Logic包含模板化类方法computeThings()它有一个enumStrategy作为其模板参数的之一。computeThings()中的逻辑取决于编译时间Strategy,所以ifconstexpr是一种合理的实现方式。变体1#includeclassLogic{public:enumStrategy{strat_

c++ - 模板模板参数的显式匹配

考虑这个函数:templateclassC,classT,classAlloc>voidfoo(C&container){std::cout函数foo()接受std::vector,但它也接受std::map在C++17中因为Compare和Allocator有默认值。备注std::map在C++14中失败。我怎样才能制作foo()只接受只有2个模板参数的模板,所以失败并显示std::map在C++17中? 最佳答案 HowcanImakefooonlyaccepttemplateswithexactlyonly2templatep

C++ 我怎样才能改进这个模板元程序来返回包含大小的数组?

我有一个名为choose_literal的实用程序它选择编码为char*,wchar_*,char8_t*,char16_t*,char32_t*的文字字符串取决于所需的类型(选择)。看起来像这样:templateconstexprautochoose_literal(constchar*psz,constwchar_t*wsz,constCHAR8_T*u8z,constchar16_t*u16z,constchar32_t*u32z){ifconstexpr(std::is_same_v)returnpsz;ifconstexpr(std::is_same_v)returnwsz;

c++ - 限制类模板类型

我正在尝试使用SFINAE来限制我正在编写的类的允许模板参数类型。这是我想出的一个简单的人为示例,我相信它可以说明我想做的事情。我确定这个问题已经在某个地方得到了回答,但我找不到。以下是我发现的两种解决问题的方法:首先(SFINAE):template::value>::type>classInteger{public:Tvalue;};intmain(){Integeri;//AlowedIntegerd;//NotallowedIntegerdd;//Allowed(Undesired)return0;}我不喜欢这个解决方案的地方是main函数中的第三个示例有效。第二个(stati

c++ - 为什么参数推导在这个模板模板参数中不起作用

我有以下模板函数,它的参数是模板模板参数。templateclassCONTAINER=std::vector>voidmerge(typenameCONTAINER::iteratorit){std::cout下面的代码使用了这段代码。std::vectorvector1{1,2,3};merge(begin(vector1));它按预期工作,但是当我使用merge(begin(vector1));它无法推断出T的类型.我认为它可以从std::vector::iteratorit;推导出类型作为int.为什么编译器无法推断类型? 最佳答案

c++ - 将 std::variant 转换为模板类实例的 std::tuple

transform_v2t下面代码中的函数构建了模板类A实例的元组:templatestructA{Tval;};templateclassT,std::size_t...index>inlineconstexprautotransform_v2t(std::index_sequence){returnstd::make_tuple(T>()...);}templateclassT>inlineconstexprautotransform_v2t(){returntransform_v2t(std::make_index_sequence>());}typedefstd::varian

c++ - 从非模板基派生模板类

我正在尝试让Derived从Base派生:classBase{public:Base(){};};templateclassDerived:publicBase{public:Derived::Derived(){}};这给了我以下错误:errorC3254:'Derived':classcontainsexplicitoverride'{ctor}'butdoesnotderivefromaninterfacethatcontainsthefunctiondeclarationnote:seereferencetoclasstemplateinstantiation'Derived'

c++ - 使用可转换类型调用重载函数时模板构造函数歧义

我有2个类,它们都具有单参数模板化构造函数。一个是整数类型的全部,而在另一个类中,它用于绑定(bind)任何可迭代对象。我有两个针对特定函数的重载,这些函数将使用这些类型中的每一种。如果我使用整数类型或字符串或至少适用于一个类的东西调用该函数,我会收到有关调用歧义的错误。#includeclassA{public:templateA(Iterableit):s(it.begin(),it.end()){}private:std::strings;};classB{public:templateB(Integeri):i(i+1){}private:inti;};voidUse(Aa){

c++ - 函数模板参数的模板返回类型

我正在尝试编写一些样板,用于在传递给各种签名的函数之前转换参数类型。最简单的示例是采用需要int*的函数并将其包装以创建采用std::vector的函数,如下例所示。#include#includeusingnamespacestd;templatevoidtfunc_api(vector&a){returnF(&(a[0]),a.size());}voidreset(int*a,size_tn){for(size_ti=0;ifoo={1,2,3,4};tfunc_api(foo);for(autoe:foo)cout我正在使用函数模板参数,因为我认为这是处理不同签名的最简单方法,例