草庐IT

专门化

全部标签

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获得这种行为,但它的可读性较差,更难

c++ - 我可以将 std::begin 和 std::end 专门化为 equal_range() 的返回值吗?

header提供std::equal_range(),以及一些将它作为成员函数的容器。这个函数让我困扰的是它返回一对迭代器,这使得从开始迭代器到结束迭代器的迭代变得乏味。我希望能够使用std::begin()和std::end()这样我就可以使用C++11基于范围的for循环。现在,我听到了关于特化的矛盾信息std::begin()和std::end()-有人告诉我,向std命名空间添加任何内容都会导致未定义的行为,而我也被告知您可以提供自己的std::begin()特化。和std::end().这就是我现在正在做的:namespacestd{template::iterator_ca

c++ - 专门化采用通用引用参数的函数模板

如何特化采用通用引用参数的函数模板?foo.hpp:templatevoidfoo(T&&t)//universalreferenceparameterfoo.cpptemplatevoidfoo(Class&&class){//dosomethingcomplicated}在这里,Class不再是推导类型,因此是Class确切地;它不可能是Class&,所以引用折叠规则在这里对我没有帮助。我也许可以创建另一个需要Class&的特化参数(我不确定),但这意味着复制foo中包含的所有代码对于所有参数的右值/左值引用的每种可能组合,这是通用引用应该避免的。有什么办法可以做到这一点吗?如果有

C++ 模板 - 专门化函数

我有以下代码://1templatevoidc(Tin){coutvoidc(int*in){coutvoidc(T*in){cout有人能解释一下为什么在下面的示例中编译器选择函数#3,但是当我改变函数#2和#3的顺序时,编译器选择函数#2吗? 最佳答案 编译器首先选择主模板,然后才确定使用哪个特化。也就是说,在您的情况下,编译器总是选择第二个主模板,即#3。但是,由于您在特化函数模板时没有指定模板参数,您的特化会根据其位置特化一个不同的主模板:按照给定的顺序,它特化第一个主模板,当您交换#2和#3它专用于第二个主模板。在14.7