草庐IT

c++ - 除了模板之外,还有其他 C++ 元编程替代方案吗?

我一直在大量使用元编程,但有时仅结合使用C宏和模板是不够的。如果元编程平台仅适用于linux等,我认为缺点可能是缺乏跨平台兼容性。是的,除了模板之外,现在还有这样的东西吗?元编程的谷歌搜索以模板元编程为主,所以现在很难找到..编辑:这是我一直在做的事情的一个例子。假设我有一个通用类,用于将文件保存到缓冲区或从缓冲区加载文件。我们称它为FilePack。我有一个定义宏,看起来像defineFilePack(BaseClass,"code-a")它基本上创建了一个名为“BaseClassPack”的类,该类被定义为一个子类。下面是那个东西。classFilePack{public:char

C++ 当模板参数推导失败时

为什么C++不能确定我打算创建一个unique_ptr用这个语法?(a之前已声明为unique_ptr)a=unique_ptr(newA());必须包含似乎非常多余.这适用于我使用的大多数函数模板,为什么unique_ptr不行?编辑:C++现在支持make_unique,没有冗余。 最佳答案 std::unique_ptr是一个class模板,而不是function模板。参数推导只发生在function模板,而不是class模板。一个常用的技巧是编写一个函数模板,创建一个实例化类模板类型的对象,例如:templatestd::u

C++模板构造函数初始化

templateclassNode{public:Node(Node*next=NULL,Tdata=T()):_next(next),_data(data){}Node*_next;T_data;};我是C++模板的新手。对于默认参数,Tdata=T()是标准的做法吗?也许Tdata=0也可以? 最佳答案 那不是“构造函数初始化”,那是默认参数。它允许调用者提供比函数更少的参数,未指定的参数将采用默认值。另一种方法是:templateclassNode{public:Node(Node*next,Tdata):m_next(nex

c++ - 使用点后模板函数的特化会破坏编译

考虑下一个例子:#includetemplatevoidfoo();intmain(intargn,char*argv[]){foo();}templatevoidfoo(){std::cout编译失败并显示以下错误消息:rg.cpp:12:error:specializationof‘voidfoo()[withinta=1]’afterinstantiation标准中的哪一段解释了这个错误?PS:我知道如果我将函数定义移到main前面将使错误消失。 最佳答案 根据标准,我认为这是未定义的行为。在UB的情况下,工具链可以做什么没有

c++ - 提取可变参数模板参数包并将其用于类型特征元函数中的另一个可变参数模板?

我想确定是否有任何可变参数类模板是另一个类的基础。通常我会使用std::is_base_of,但我认为我的用例不适合,而且我不确定std或boost中是否已经有一些东西可以处理这个问题。我希望可变参数基类模板的参数包来自另一个可变参数类模板。下面是一些示例代码,希望能解释我想做什么:用法:is_variadic_base_of::value;勇气://testforvariadicbaseofnon-variadictemplateclassA,typenameB,typename...ArgsC>structis_variadic_base_of:std::is_base_of,B>

c++ - 如何正确声明自引用模板类型?

如何声明引用自身的模板类型?templateclassAnimal{public:TgetChild();}有了这个,我得到了一个关于缺少类型说明符的编译器错误。我尝试转发声明Animal,但没有成功。我正在尝试施加类型约束。一个Lion只能有一个Lion作为child,一个Bear有一个Bear,等等。编辑我将发布实际类(class)的一部分。它是可以出现在链表中的类的模板:template>classLinked{private:T*m_prev;T*m_next;}我想强制该类只能指向同一类(或子类)的对象。 最佳答案 在这种

C++:如何在类和基元上使用模板?

我有一个关于可与类或原始类型参数一起使用的模板的问题。下面是一些示例代码:(注意:我有更复杂的真实代码,下面的代码没有用,但它重现了同样的问题)templateclassFoo{Tvalue;public:Foo(){}constT&getValue()const{returnvalue;}Foo&setValue(constT&other){value=other;return*this;}};structBar{intx;Bar():x(3){}};intdoit(){Foofooint;Barbar;bar.x=44;Foofoobar;fooint.setValue(3);//

采用依赖于模板参数的 std::function 的 C++11 模板函数

我正在尝试编写一个接受依赖于模板参数的std::function的模板函数。不幸的是,编译器无法正确推导出std::function的参数。这里有一些简单的示例代码:#include#includeusingnamespacestd;voidDoSomething(unsignedident,unsignedparam){coutvoidCallFunc(Identident,Paramparam,std::functionop){op(ident,param);}intmain(){unsignedid(1);unsignedparam(1);//Thefollowingfailst

c++ - 模板函数的特化可以是虚拟的吗?

比如,classA{templateTDoStuff();templatevirtualintDoStuff()=0;};VisualStudio2010说不,但我有一种奇怪的感觉,我只是搞砸了语法。成员函数模板的显式完全特化可以是虚拟的吗? 最佳答案 在类中显式特化是不合法的。即使您可以使其部分特化,您仍然会遇到“模板不能是虚拟的”问题。n3290,§14.5.2指出:Amemberfunctiontemplateshallnotbevirtual.并给出这个例子:templatestructAA{templatevirtualv

c++ - 在模板 vector 上返回迭代器

我一直在四处寻找类似的东西,但找不到(或者我找到的东西没有帮助)。我正在尝试能够在模板类的vector上使用迭代器,返回它并在类外部使用它,如下面的代码所示。#include#includeusingnamespacestd;namespacens{templateclasstest{private:vectorcontainer;public:typedefvector::iteratoriterator;vector::iteratorbegin(){returncontainer.begin();}vector::iteratorend(){returncontainer.end