草庐IT

c++ - 使用模板化可变模板参数作为专用参数

我的标题可能有误-如果是这样,请纠正我,但在某些时候我很难跟踪我实际想要实现的元事物;)我有一个这样的类函数模板:templateclassMapType>ExpressionExpression::substitute(MapTypeconst&identifierToExpressionMap)const{returnSubstitutionVisitor(identifierToExpressionMap).substitute(something);}重要的部分是MapType。这个想法是允许std::map或std::unordered_map随意插上。使用GCC和Clang

c++ - 在 C++ 中嵌套在模板中的类中使用基类的成员时出错

考虑以下示例:templatestructA{structB{intb;};structC:B{voidf(){b=0;}};};用GCC4.8.1编译它会出现以下错误:test.cc:Inmemberfunction‘voidA::C::f()’:test.cc:9:11:error:‘b’wasnotdeclaredinthisscopeb=0;^但是,b是父类B的成员(我在示例中使用了struct来公开所有内容)并且如果我使A非模板一切编译。为什么编译器会报错,我该如何避免? 最佳答案 这在语言中是一种晦涩的极端情况,但解决方

c++ - 使用模板输入双关语

我想知道以下代码是否是一种可接受的方法,可以在不违反严格的别名规则的情况下处理类型双关语。我意识到此方法依赖于GCC编译器扩展,因此无需指出这一点。templateinlineoutput_typepunning_cast(constinput_type&input){static_assert(std::is_pod::value,"output_typeforpunning_castmustbePOD");static_assert(std::is_pod::value,"input_typeforpunning_castmustbePOD");static_assert(size

c++ - 模板特化不起作用

考虑以下代码:templateclassBar{};templateclassFoo{};templatetemplatestructFoo,Bar>{structEq{};};如您所见,有一个可变类型Bar和一个类型Foo.Foo有一个专门化,以防两个Bars用作其模板参数。这个特化有一个内部类型Eq.但是,以下内容不起作用:typenameFoo,Bar>::Eqb;它告诉我们没有类型Eq在Foo,Bar>,即编译器不选择模板特化而是选择Foo的基本定义确实没有内部Eq类型。我在这里做错了什么?为什么编译器不选择特化? 最佳答案

c++ - 类的大小与封闭模板类的大小

考虑下面的代码:classFoo{...};templateclassBar{Tt;};是否保证sizeof(Foo)==sizeof(Bar)总是评估为true跨任何标准C++编译器?是否存在上述条件永远不会成立的情况? 最佳答案 我不相信标准会做出这种保证-实现可以在Bar的末尾自由添加填充。但很难理解为什么任何真正的实现都会在Bar而不是Foo的末尾添加填充。除非,比方说,Foo被明确指定了一些非默认对齐方式(例如字节对齐);Bar将被填充到默认对齐方式。 关于c++-类的大小与封

c++ - 模板函数特化 : linker error

当模板参数类型相同时,我正在尝试专门化两个模板参数的函数。我通过以下方式进行:#include#includeusingnamespacestd;templateintfun(U&u,Tt);templateinlineintfun(int&u,floatt){coutinlineintfun(U&u,typenamestd::enable_if::value,T>::typet){cout此代码编译良好(GCC4.8.2),但当U和T相同时,链接器会为所有fun调用提供undefinedreference类型。为什么它不起作用?链接器输出:g++-std=c++11test.cpp/

c++ - 任意类的 const 和非 const 成员函数的模板包装器

我想要一个模板化类(包装器),它可以接受所有可能的类(T)并使用这些类(函数)的成员函数做一些事情(这里是求值)。我找到了类似的请求,你可以看到here和here,但均不能满足以下两个条件。条件:指向类实例的指针(T*ptr)和指向成员函数(function)的指针都必须在包装类中可访问。包装类应与const和非常量成员函数一起使用。这里的代码只适用于非常量:#include#includetemplatestructWrapper{Wrapper(T*ptrT);doubleevaluate(double);protected:T*myPtrT;};templateWrapper::

c++ - 类模板的静态成员是否被隐式实例化?

考虑以下两个引号:[C++11:14.7.1/1]:[..]Theimplicitinstantiationofaclasstemplatespecializationcausestheimplicitinstantiationofthedeclarations,butnotofthedefinitionsordefaultarguments,oftheclassmemberfunctions,memberclasses,scopedmemberenumerations,staticdatamembersandmembertemplates;[..][C++11:14.7.1/8]:T

c++ - 完美转发可变参数模板到标准线程

我正在尝试制作一种std::thread形式,它在线程中执行的代码周围放置一个包装器。不幸的是,由于我对右值和Function的理解不足,我无法编译它。我试图传递的模板化类型。这是我的代码:#include#include#includevoidSimple2(inta,intb){}templatevoidWrapper(Function&&f,Args&&...a){f(std::forward(a)...);}classPool{public:templatevoidBinder(Function&&f,Args&&...a){std::threadt(Wrapper,std::

c++ - 具有 unique_ptr 作为成员的 C++ 模板的构造函数失败

当类模板包含指向另一个类的unique_ptr时,该类的构造函数不会将unique_ptr移动到新对象中。使用相同的类,但没有模板,构造函数按预期生成对象。#includeclasstest1{public:std::strings_;test1(std::strings):s_(s){};};classtestu{public:std::unique_ptrus_;testu(std::unique_ptrus):us_(std::move(us)){};};templateclasstestt{public:std::unique_ptrus_;testt(std::unique_