草庐IT

c++ - 为什么要使用模板特化?

我想知道为什么模板特化有意义?下面的东西不是等价的吗?模板特化:templatevoidf(Tt){something(t);}templatevoidf(intt){somethingelse(t);}非模板函数而不是特化:voidf(intt){somethingelse(t);}我相信这些是相同的,因为非模板功能将始终是首选。 最佳答案 这是我想出的答案:如果模板参数不是被定义函数的参数则不同:templatevoidf(){Tt;something(t);}templatevoidf(){intt;somethingelse

c++ - 如何将模板中具有非依赖名称的 msvc++ 代码移植到 Linux?

我可以处理移植平台相关的功能。我有一个问题,我在Linux上试过的编译器(clang和g++)不接受以下代码,而msvc++编译器接受:templateclassBase{protected:TValue;};templateclassDerived:publicBase{public:voidsetValue(constT&inValue){Value=inValue;}};intmain(intargc,charconst*argv[]){Derivedtmp;tmp.setValue(0);return0;}g++错误:main.cpp:Inmemberfunction‘void

接口(interface)的 C++ 模板特化

为什么编译器在运行以下代码时不选择接口(interface)模板?是否需要额外的声明/提示,或者这通常不起作用?我只是好奇这是否真的可能。classInterface{public:virtualvoidMethod()=0;virtual~Interface(){}};classDerived:Interface{public:voidMethod(){coutstructSelector{staticvoidSelect(T&o){coutstructSelector{staticvoidSelect(Interface&o){o.Method();}};inti;Selector

c++ - 具有默认参数作为模板类型的函数

我正在尝试使用带有默认参数的函数作为函数指针模板参数:templateclassA{};voidfoo1(inta=0){}voidfoo2(){}intmain(){//Aa1;a2;}编译错误是:main.cpp:7:7:error:couldnotconverttemplateargument‘foo1’to‘void(*)()’是否有特定的语法可以让它工作?还是特定的语言限制?否则,替代方法是使用两个独立的函数而不是默认参数:voidfoo1(inta){}voidfoo1(){foo1(0);}更新我知道签名是不同的,但我想知道是否有一种方法可以方便地完成这项工作而不需要修改

c++ - 使用 static_assert 确定特定模板参数是否为特定无类型类模板

我想要一个将参数限制为仅派生自特定模板类的类型的函数。在这种情况下,basic_string(来自STL-docs)。例如,声明了一个wstring:typedefbasic_string,allocator>wstring;基本思路是这样的:templatevoidstrings_only_please(TStringmessage){static_assert(is_base_of::value,"Notastringtype!");}当然,虽然没有指定basic_string,但它无法编译……它需要一个真实的类型。(虽然我可能只对少数实际字符串类型进行硬编码,但我正在寻找针对此模

c++ - 在 C++ 模板中使用 'using' 的正确做法

我有一个内部使用多个STL列表的小类templateclassMC_base{usingOBJ_LIST=std::list;usingOBJ_VAL=typenameOBJ_LIST::value_type;usingOBJ_ITR=typenameOBJ_LIST::iterator;usingOBJ_CITR=typenameOBJ_LIST::const_iterator;OBJ_LISTA,B,C;...};使用using语句,如果我在类定义中编写一个迭代器,它看起来干净整洁:OBJ_ITRbegin(){returnA.begin();};OBJ_ITRend(){retu

c++ - 我可以使用类级别的 typedef 作为基类的模板参数吗?

假设一个模板化的基类:templateclassBaseClass;在其他类中,我想从中继承,其中T是一个相当复杂的类型,所以我想使用typedef。因为我不想污染命名空间,所以我希望在类定义中包含typedef:classChildClass:publicBaseClass{typedefMyVeryVeryComplicatedTypeLocalType;...}现在当然我还不能使用LocalType作为BaseClass的模板参数并且必须写两次复杂的定义(MyVeryVeryComplicatedType)。(所以我猜标题问题的答案是“否”。)问题:有没有办法只定义一次,但仍然只

c++ - 模板参数简化

我是C++的新手(使用C++2011),我想找到以下问题的解决方案。我有一个代表函数的类:classCurve{private:...public:std::arrayvalue(doubles);}我正在使用该对象将此函数传递给由类表示的算法:templateclassAlgorithm{private:Functorf;std::arraya;public:...}然后我创建对象Algorithmsolver;但是3显然是来自任何Curve类型对象的方法值返回的数组大小的3。我想简化这段代码,以便我可以使用:Algorithmsolver;但我不知道该怎么做。你介意给我一个提示吗?

c++ - 模板结构中的友元运算符引发重新定义错误

考虑这段代码:templatestructA{friendstd::ostream&operatori;Aj;}它不编译,因为A的两个实例实例化了operator两次使用相同的签名,所以我收到此错误:test.cpp:26:25:error:redefinitionof‘std::ostream&operator如何解决这个问题?当该运算符可能对两个不同的实例化具有相同的签名时,我如何才能在模板中拥有一个友元运算符?如何在不触发重新定义错误的情况下解决此问题? 最佳答案 我真的看不出像这样声明friend有什么用,尽管如此你可以这样

c++ - 传递给模板函数的两个 lambda 使参数的类型推导不明确——为什么?

如果我将一个lambda传递给它,我有一个模板可以工作,但是在一个将两个lambda映射到相同模板化类型的相关模板中,它无法推断出该类型,并且MSVC++Express2013提示模板参数不明确。首先要明确的是,这里没有进行重载(或特化)——我下面的两个示例是唯一具有这些标识符的实体。以下是模板,它们简单地将可调用对象应用于参数并返回结果:templateautoWhichOp1(Aargument,OPfirstOp)->decltype(firstOp(argument)){returnfirstOp(argument);}templateautoWhichOp2(Aargumen