草庐IT

C++ 模板可移植性

我正在更新一个已有10年历史并在Mac和Windows上使用MetrowerksCodeWarrior的代码库。我正在更新到OSX、XCode3.2、UniversalBinary。我似乎遇到了很多与模板相关的错误,并且在模板方面不是天才(并且忘记在早餐时吃健康剂量的磨砂模板),我发现自己想知道模板的可移植性问题。IIRC,模板是/或可以是特定于编译器的?有没有人对他们推荐的模板有建议或教程? 最佳答案 是和否——为一个当前编译器编写的最合理的模板代码将在其他当前编译器上正常工作。编译器随着时间的推移不断进步,因此许多新代码无法在旧

c++ - (静态初始化/模板实例化)工厂模式的问题

为什么以下代码会引发异常(在调用map::at的createObjects中)或者可以查看代码(及其输出)here有趣的是,如果注释行在microsoft和gcc编译器(参见here)中都被取消注释,代码将按预期工作,这甚至可以将initMap作为普通静态变量而不是静态getter使用。我能想到的唯一原因是静态registerHelper_对象(factory_helper_)和std::map对象(initMap)是错误的,但是我看不出这是怎么发生的,因为map对象是在第一次使用时构造的,而且是在factory_helper_构造函数中构造的,所以一切都应该没问题,不是吗?更令我惊讶

c++ - 模板与开关

我正在尝试在C++领域找到自己的出路,但现在越来越困惑。玩具应用程序是一个非常基本的OpenGL引擎。所以这是(我想很简单)问题:我想处理不同顶点数据的网格,所以我有例如structVertex{Vector3fposition;}structVertexN:publicVertex{Vector3fnormal;}现在我需要一个Mesh类,它保存数据并绘制它。我试过这样的事情:templateclassMesh{public:Mesh();~Mesh();voidload(constT*vertices,intnum);voiddraw();protected:T*vertices_

c++ - 如何使我的工厂的标题不依赖于它创建的模板化对象?

我有一个像这样的抽象基类:classAbstractBaseClass{};派生自它的模板化具体类:templateclassConcreteClass:publicAbstractBaseClass{public:ConcreteClass(Tinput):data(input){}private:Tdata;};我有一个创建AbstractBaseClasses的工厂类classMyFactory{public:boost::shared_ptrCreateBlah();boost::shared_ptrCreateFoo();templateboost::shared_ptrCr

c++ - 成员函数模板放在哪里

定期让我感到沮丧的C++方面是决定模板在头文件(传统上描述接口(interface))和实现(.cpp)文件之间的位置。模板通常需要放在header中,公开实现,有时还需要引入额外的header,而这些header以前只需要包含在.cpp文件中。我最近又遇到了这个问题,下面是一个简化的例子。#include//for~Counter()andcountAndPrint()classCounter{unsignedintcount_;public:Counter():count_(0){}virtual~Counter();templatevoidcountAndPrint(constT

c++ - 模板化成员函数 typedef 无法编译

#include#includeusingnamespacestd;voidprintstr(conststring&s){coutclassTest{public:typedefvoid(*Func)(constA&);};typedefvoid(*Func)(conststring&);templatevoidbind(Test::Funcf,//在上面的代码中,我尝试使用另一个类中的函数指针typedef。如图所示,它没有编译,但是其他两行中的任何一行都没有注释,而不是Test::Funcf,。行,它编译得很好!这是我不能用C++做的事情吗?需要什么语法?使用g++4.4.3,我

c++ - 混合模板函数重载和继承

打印以下代码:genericoverload但我想要的是在两种情况下都调用了重载或特化,而不是通用的。我并没有试图将重载与模板特化混合在一起,它们在这里是因为没有一个像我预期的那样工作。是否有任何模板魔术可以实现这一目标?#includeclassInterface{};classImpl:publicInterface{};classBar{public:templatevoidfoo(T&t){std::coutvoidBar::foo(Interface&t){std::cout 最佳答案 使用type_traits测试参数是

c++ - 帮助模板化字节交换功能,性能受到影响?

templateinlinevoid*byteswap(void*__x);templateinlinevoid*byteswap(void*__x){return(*(uint16*)__x>>8)|(*(uint16*)__xinlinevoid*byteswap(void*__x){return(byteswap(__x&0xffff)>16));}templateinlineTbyteswap(T&swapIt){return(T*)byteswap(swapIt);}intmain(){uint32i32=0x01020304;uint16i16=0x0102;byteswa

java - 什么是 Java 等同于 C++ 的 for_each 模板?

在以下代码中,您可以应用任何函数f(例如,加、减等)。我如何通过Java做到这一点?templateFunctionfor_each(InputIteratorfirst,InputIteratorlast,Functionf){for(;first!=last;++first)f(*first);returnf;} 最佳答案 要使此代码在Java中运行,您需要对其进行两项主要更改。首先,您需要将STL样式的迭代器替换为Java样式的迭代器,幸运的是这并不难。其次,您必须更改对不同类型对象的函数指针或仿函数参数的使用,因为Java不

使用 shared_ptr 到 const T 的 C++ 模板实例化

假设我有一个类templateclassA{public:templatevoidf(std::tr1::shared_ptr>v1,std::tr1::shared_ptr>v2){}};以下不编译:Aa;std::tr1::shared_ptr>v1(newstd::vector());std::tr1::shared_ptr>v2(newstd::vector());a.f(v1,v2);编译错误是:error:nomatchingfunctionforcallto'A,std::allocator>>::f(std::tr1::shared_ptr>>&,std::tr1::s