草庐IT

c++ - 专门化模板化数据类型的模板

我有这种情况:#includetemplateTf(){returnT();}templatetemplatestd::vectorf>(){return{T()};}intmain(){f>();}我正在尝试为std::vector专门化模板,但我收到此错误:error:toomanytemplate-parameter-listsstd::vectorf>(){我怎样才能专注于std::vector? 最佳答案 不存在部分专用函数模板这样的东西。您正在做的是创建一个新模板,因此正确的语法是:templatestd::vector

c++ - SFINAE:检测是否存在需要显式专门化的模板函数

作为mypreviousquestion的后续行动,我正在尝试检测是否存在需要显式专门化的模板函数。我当前的工作代码检测非模板函数(感谢DyP的帮助),前提是它们至少采用一个参数以便可以使用依赖名称查找://switchto0totesttheothercase#defineENABLE_FOO_BAR1namespacefoo{#ifENABLE_FOO_BARintbar(int);#endif}namespacefeature_test{namespacedetail{usingnamespacefoo;templatedecltype(bar(std::declval()))t

c++ - 是否可以将模板专门用于语言链接?

函数的语言链接是其类型的一部分:ISOC++标准的7.5.1[dcl.link]:Thedefaultlanguagelinkageofallfunctiontypes,functionnames,andvariablenamesisC++languagelinkage.Twofunctiontypeswithdifferentlanguagelinkagesaredistincttypeseveniftheyareotherwiseidentical.是否可以根据函数指针的链接类型专门化模板,或者以其他方式内省(introspection)函数指针的类型以确定其在编译时的链接?第一次

c++ - 基于类成员的存在/不存在来专门化 C++ 模板?

考虑以下几点:structA{typedefintfoo;};structB{};templatestructC{};我想特化C,以便C获得一种特化而C获得另一种,基于类型名称T::foo的存在与否。这可能使用类型特征或其他一些模板魔术吗?问题是在实例化C时,我尝试的所有操作都会产生编译错误,因为B::foo不存在。但这就是我想要测试的!编辑:我认为ildjarn的回答更好,但我最终想出了以下C++11解决方案。伙计,它很老套,但至少它很短。:)templateconstexprtypenameT::foo*has_foo(T*){return(typenameT::foo*)1;}c

c++ - 如何为基础类型 int 的枚举专门化一个类?

#includeenumclassMyEnum{Hello};templateclassMyClass{public:MyClass(Tobj):e(obj){}private:Te;};templateclassMyClass::value&&std::is_same::type,int>::value>::type>{public:MyClass(Tobj):e(obj){}private:Te;};intmain(){MyClassc(MyEnum::Hello);MyClassc1(1);//doesnotcompileduetostd::underlying_typeretu

c++ - 专门化模板类的模板化成员

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:SpecializationoftemplatedmemberfunctionintemplatedclasstemplateclassMyClass{templatevoidfunc(){printf("unspecialized\n");}};templatetemplateMyClass::func(){printf("specialzied\n");}这是行不通的。是否可以专门化模板类的模板方法?

c++ - SFINAE:编译器不选择专门的模板类

我有一个SFINAE问题:在下面的代码中,我希望C++编译器选择专用仿函数并打印“special”,但它打印的是“general”。#include#includetemplatestructFunctor{voidoperator()()const{std::cerrstructFunctor{voidoperator()()const{std::cerrVec;};intmain(){Functorac;ac();}如何修复它以便自动使用专用结构?请注意,我不想直接将Functor结构专门化为Foo,但我想将其专门化为具有Vec类型的所有类型.附言:我使用的是g++4.4.4

c++ - 为什么 type_traits 是用专门的模板结构而不是 constexpr 实现的?

标准将它们指定为模板struct而不是简单的bool值constexpr有什么原因吗?在一个可能会在主要问题的良好答案中得到回答的附加问题中,如何对非结构版本执行enable_if操作? 最佳答案 一个原因是constexpr函数无法提供嵌套的type成员,这在某些元编程情况下很有用。为了清楚起见,我不是只谈论产生类型但显然不能产生类型的转换特征(如make_unsigned)constexpr功能。所有类型特征都提供了这样一个嵌套的type成员,甚至是一元类型特征和二进制类型特征。例如is_void::type是false_typ

c++ - 专门化变量的值在编译时是否已知/未知

如果在编译期间(在实际编译和运行程序之前)其参数之一的值已知/未知,如何专门化模板函数?我还不知道怎么做。想法1:#include#includeintmain(void){inta;//valueofaisnotknownatcompiletimeboolb=(a==a);//valueofbisknownatcompiletime.std::is_assignable::value}//g++magic.cpp-std=c++14//error:wrongnumberoftemplatearguments(1,shouldbe2)//std::is_assignable::valu

C++ 专门针对特定类型的 lambda

这个问题在这里已经有了答案:Is(orwillbe)theuseoffamiliartemplatesyntaxinlambdaexpressionsallowed?(2个答案)关闭6年前。我正在玩转所呈现的lambda“重载”here,很快就到了我发现创建专门的lambda闭包很方便的地步。所以我首先试错了一下,我最有希望的试验是autocall_for_vector=[]template(std::vector){};但是,稍后再看cppreference显示标准似乎都不允许这种或类似的结构。不支持此类特化的原因是什么?我知道可以使用SFINAE获得这种行为,但它的可读性较差,更难