草庐IT

c++ - C++ 编译如何处理共享库和模板

我曾经在某处读到,C++本质上是根据编译时的使用情况枚举所有可能的模板类型,因此模板的概念在运行时不存在。这似乎也是来自TemplateCompilation的公认答案。我的问题是,如果是这种情况,当一切都已编译并完成时,STL如何处理自定义类型?这可以更广泛地应用于任何使用模板编译的自定义库。(我本可以在答案的评论中提出这个问题,但我没有足够的分数) 最佳答案 如果一个库想要提供其客户可以用任意类型实例化的模板,它必须在头文件中提供模板的完整定义。这就是为什么许多C++库(包括大部分Boost库)都是仅包含头文件的原因。然后,编译

c++ - 有没有办法在模板类中处理可变数量的参数?

我有一组回调类,用于处理参数数量可变的回调。现在我有大约6个不同的实例来处理不同数量的参数。有没有办法让一个实例可以处理可变数量的参数?最终我希望每个参数都是POD类型或类指针或结构指针。有什么想法吗?templateclasskGUICallBackPtr{public:kGUICallBackPtr(){m_obj=0;m_func=0;}voidSet(void*o,void(*f)(void*,T*));inlinevoidCall(T*i){if(m_func)m_func(m_obj,i);}inlineboolIsValid(void){return(m_func!=0)

使用仅存在于某些数据类型中的字段的 C++ 模板函数?

是否有可能有一个C++模板函数,它可以根据传递给它的输入数据的类型访问其输入数据中的不同字段?例如我有以下形式的代码:typedefstruct{inta;intb;}s1;typedefstruct{inta;}s2;templatevoidmyfunc(VTI_typeVRI_data,boolcontains_b){printf("%d",VRI_data.a);if(contains_b)//orsuggestyourowntesthereprintf("%d",VRI_data.b);//thislinewon'tcompileifVTI_typeiss2,eventhoug

c++ - 如何为 boost::bind 强制模板函数重载?

我正在尝试通过使用boost::bind和boost::contains为std::find_if创建谓词(来自提升/算法/字符串库)。以下代码段显示了我如何尝试实现此目的的两种方式。#include#include#include#include#includeintmain(intargc,char**argv){std::strings1("hellomom");std::strings2("byemom");boost::functionf=&boost::contains;std::coutcontain_hello=boost::bind(boost::contains,_

c++ - 基于模板参数在 C++ 中模拟动态调度

为了问题的缘故,这被大大简化了。假设我有一个层次结构:structBase{virtualintprecision()const=0;};templatestructDerived:publicBase{typedefTraits::TypeType;Derived(Typedata):value(data){}virtualintprecision()const{returnPrecision;}Typevalue;};我想要一个带有签名的非模板函数:Base*function(constBase&a,constBase&b);其中函数结果的特定类型与a和b中具有较大Precisio

c++ - 理解c++中模板的问题

在使用模板函数之前,模板代码不会被编译。但是编译后的代码保存在哪里,是保存在最初使用模板函数的目标文件中吗?例如,main.cpp是从文件test.h中调用一个模板函数,编译器生成一个目标文件main.o,模板函数在main.o文件里面吗?因为模板代码不是内联的,是吗? 最佳答案 它完全依赖于编译器实现。大多数编译器会围绕、内联或在类似cpp的文件中生成代码,然后使用它们进行编译。有时,通过优化设置,一些编译器甚至会重用相同的代码,而不是为每个cpp重新创建它。因此您必须查看编译器的文档以获取更多详细信息。

c++ - 函数模板特化失败

这是家庭作业,尽管它已经通过不同的方法提交。我从VisualStudio2008中得到以下结果errorC2893:Failedtospecializefunctiontemplate'voidstd::sort(_RanIt,_RanIt,_Pr)'代码如下main.cppDatabasedb;db.loadDatabase();db.sortDatabase(sort_by_title());Database.cppvoidDatabase::sortDatabase(constsort_by&s){std::sort(db_.begin(),db_.end(),s);}函数对象定

c++ - 简单的模板继承问题C++

templateclassbaseclass{protected:Tdata;public:baseclass(){};voidsetData(Td);};templatevoidbaseclass::setT(Td){data=d;}上面显示的是我的基类,一个protected成员变量,一个setter。templateclassaclass:publicbaseclass{public:aclass(Td);};templateaclass::aclass(Td){setData(d);现在这是我的第一个子类。出于某种原因,直接访问protected成员变量是行不通的,尽管我认为它

c++ - 特定模板特化的重载成员函数

我有一个tPoint类,它将实现为具有不同的基类型,所以templateclasstPoint{Tx;Ty;public:voidSet(Tix,Tiy){x=ix;y=iy;}};当类型T为int时,tPoint,我想要一个特殊的Set(float,float),这样我就可以在赋值前对值进行舍入。我认为通过特化我可以:templatevoidtPoint::Set(floatix,floatiy){x=ix+.5;y=iy+.5;}这样编译器就会提示类定义中没有匹配的函数。但是如果我在类Set(float,float)中声明,那么它会说它已经定义了(当它为T=float编译时)我希望

c++ - 模板中的多态类

假设我们有一个类层次结构,其中我们有一个通用的Animal类,它有几个直接继承自它的类(例如Dog、Cat、Horse等)。在此继承层次结构上使用模板时,仅使用SomeTemplateClass是否合法?然后将DogsandCatsandHorses放入这个模板对象中?例如,假设我们有一个模板化的Stack类,我们想在这里接待各种动物。我可以简单地说Stacks;Dogd;s.push(d);Catc;s.push(c);吗? 最佳答案 如果否,请回答您的问题。但您可以使用SomeTemplateClass并将派生类的对象指针传递给