草庐IT

Templates

全部标签

c++ - CRTP 中的模板化派生类(奇怪的重复模板模式)

我使用的CRTP不能用g++4.2.1编译,也许是因为派生类本身就是一个模板?有谁知道为什么这不起作用,或者更好的是,如何让它起作用?示例代码和编译器错误如下。来源:foo.C#includeusingnamespacestd;templatestructfoo;templatestructbar:foo>{Xevaluate(){returnstatic_cast(5.3);}};templatestructbaz:foo>{Xevaluate(){returnstatic_cast("elk");}};templatestructfoo:D{Xoperator()(){return

c++ - 现代 C++ 设计中的 CompileTimeChecker 未按预期工作

我最近开始阅读AndreiAlexandrescu的《现代C++设计》。阅读编译时断言后,我尝试了以下代码:templatestructCompileTimeChecker{CompileTimeChecker(...){};};templatestructCompileTimeChecker{};#defineSTATIC_CHECK(expr,msg)\{\classERROR_##msg{};\(void)sizeof(CompileTimeChecker((ERROR_##msg())));/*Line1*/}intmain(){STATIC_CHECK(sizeof(char

c++ - 模板化时没有发生隐式转换

这里有几个相关但不同的类。一个包含float列表;一个只包含一个。有时我想,比如说,将它们相乘。在那种情况下,我想将非列表“提升”到列表中。这是代码,它按照我想要的方式工作。#defineLIST_SZ4classVec1;classVec1_list{public:Vec1_list(){}Vec1_list(constVec1&in);floatx[LIST_SZ];};classVec1{public:Vec1(){}Vec1(constfloat&in);floatx;};Vec1::Vec1(constfloat&in){x=in;}Vec1_list::Vec1_list(

c++ - 函数模板的显式实例化失败 (g++)

我在显式实例化函数模板时遇到了一些问题(即链接错误)。VisualStudio下项目链接正常,只有在g++/Unix下,使用Eclipse-CDT,链接出错。函数调用是一个静态库的一部分,在一个大项目中与动态库链接。该函数的架构如下:函数模板在我的MathUtils.h文件的命名空间内声明(但未实现)。其中一个函数参数本身就是一个结构模板,在这个h文件(在同一命名空间下)中声明并实现。函数实现和实例化在MathUtils.cpp中。函数调用在someFile.cpp(当然是#include"MathUtils.h")中,它作为静态库的一部分进行编译和链接。让我(几乎)发疯的是构建错误不

c++ - 原子读/写值的静态断言

有没有办法检查一个值的读/写(加载/存储)是否是原子的?我有专门版本的并发容器,只能使用这些值,我想添加一个静态断言以防止意外误用。对于x86_64上的所有基本类型都是如此,但它可能不适用于所有平台或所有long数据类型。此外,小型结构和union也有可能被分配原子操作(因为它们只是被编译为使用相同大小的基本复制操作)。 最佳答案 C++0x草案在header中有一个包含宏的部分,这表明没有简单且可移植的方法来检查它。29.4Lock-freeproperty[atomics.lockfree]#defineATOMIC_CHAR_

c++ - 如何在 cpp 文件中为多种类型创建模板类成员实现

我有一个名为w32file的模板类,它适用于wchar_t和char。它声明:templateclassw32file{...}它有很多成员方法,比如这个:inlineboolisDirectory();现在我知道我可以将这些成员方法的所有实现放在头文件中,然后它们将被编译到使用我的模板的任何目标文件中。但是,我真的不想要这个,因为这个类将在所有地方使用,并且会导致大量重复的目标代码。所以目前,我有一个链接到静态库的cpp文件,它执行此操作:boolw32utils::w32file::isDirectory(){autodwAttr=GetFileAttributes(m_name.

c++ - 编译器提示模板参数的数量错误,即使它在 boost 库文件中是正确的

boost库中有一个名为has_new_operator.hpp的文件。当我使用GCC4.3.1编译文件时出现以下错误type_traits/has_new_operator.hpp:45:error:wrongnumberoftemplatearguments(1,shouldbe2)type_traits/has_new_operator.hpp:24:error:providedfor'templatestructboost::detail::test'根据第24行,它需要2个参数,这是在第42行中传递的参数。此外,如果您观察第31行,也会执行相同的操作,但编译器不会提示。21:

c++ - boost 图形库 : Bundled Properties and iterating across edges

只是想了解一下BoostGraphLibrary,我有几个问题。我正在编写一些代码,它是BGL图的包装类。我的想法是,我可以随心所欲地操作图表,然后调用包装方法以GEXF(XML)格式输出图表。我的代码是这样的:structVertex{std::stringlabel;...};structEdge{std::stringlabel;doubleweight;...};typedefboost::adjacency_listGraphType;templateclassGEXF{private:Graphgraph;...};templatevoidGEXF::buildXML(){

c++ - 如何创建函数模板签名?

我有这样的模板函数:templatelistf(constboost::function&);templatelistf(constboost::function&,list);templatelistf(constboost::function&,list,list);要运行其中一个,我需要编写例如:intone(){return1;}intinc(intx){returnx+1;}listl;f(one);f(inc,l);我的目标是写:f(one);f(inc,l);我听说这可以通过某种模板签名特化来实现,但我不知道如何实现。 最佳答案

数字类型的 C++ 非零默认值 - 重新发明?

我的想法是这样的:templatestructNumeric{Numeric(Tt=defaultValue):value(t){}Tvalue;Toperator=()(Tt);operatorT();};我可能会这样使用它:std::vector>nothingButTheTruth;我的问题很简单:这是一种好方法吗?如果是,标准库或Boost中是否存在类似的东西? 最佳答案 我更常见的模式是参数化容器,而不是类型。按自己的方式做有很多缺点:虽然你提供赋值和转换,但实际上你不能绑定(bind)一个bool&到Numeric.Av