草庐IT

c++ - 如何在 C++ 模板类之间共享 protected 成员?

考虑以下示例:class_ref{public:_ref(){}_ref(const_ref&that){}virtual~_ref()=0;};_ref::~_ref(){}templateclassref:public_ref{protected:ref(const_ref&that){}public:ref(){}ref(constref&that){}virtual~ref(){}templatereftryCast(){boolvalid;//performsomechecktomakesuretheconversionisvalidif(valid)returnref(*t

c++ - 嵌套模板类中的 std::conditional

我正在尝试以STL的样式实现RingBuffer。这意味着我还为其实现了一个迭代器,它必须作为const或非const工作。这只是迭代器部分:#include#includetemplateclassRingBuffer{public:classIterator;//actualRingBufferimplementationhere};templateclassRingBuffer::Iterator{public:typedefstd::ptrdiff_tdifference_type;typedefTvalue_type;typedeftypenamestd::condition

C++:模板中的隐式转换,为什么它不起作用?

这看起来很奇怪,但是这段简单的代码适用于int而不是T,并且不适用于模板T。templateclassPolynomial{public:Polynomial(Ti){}Polynomial&operator+=(constPolynomial&rhs){return*this;}};templateconstPolynomialoperator+(Polynomiallhs_copy,constPolynomial&rhs){returnlhs_copy+=rhs;}Polynomialx(1),y=x+2;//nomatchfor'operator+'in'x+2'

c++ - 内联函数体的潜在评估和模板成员的实例化

何时包含在标记为内联的函数中的表达式被视为“可能已评估”?a.cpptemplateconstT&foo(constT&arg){returnarg;}inlinevoiddead(){intx(21);x=foo(x);}b.cpp#includetemplateconstT&foo(constT&);intmain(intargc,char*argv[]){std::cout如果一旦定义了内联函数,表达式就被认为是“潜在求值”,那么模板应该被实例化,我希望$(CCC)-ca.cpp;$(CCC)-cb.cpp;$(CCC)a.ob.o-obin链接成功。相反,如果声明为内联的函数中

c++ - 指向可变模板静态函数的指针。如何?

我有一个代码:classFactory{public:templatestaticvoidtestFunc(Args&&...args){cout是否可以创建指向testFunc的指针?我所能做的就是这样定义它://mainvoid(*pFunc)()=&Factory::testFunc;pFunc();这行得通,但我不能像这样传递可变数量的参数:void(*pFunc)(WHAT_TO_TYPE_HERE?)=&Factory::testFunc;pFunc(10,false,'a',11.5);P.S.:使用省略号(...)一切正常。 最佳答案

所有指针的 C++ 模板和所有数组的模板

我正在寻找以下问题的解决方案:我有一个类,我想在其中为所有类型的指针和所有类型的指针重载运算符(在本例中为&)阵列。在数组的实现中,我需要访问arraysize,在指针的实现中,我必须能够对取消引用的对象执行某些操作。正如指出的那样here,数组的方式很清楚:templatevoidoperator&(T(&arr)[N]){cout但对于指针来说,以下都不起作用://ifIusethis,theoperatorgetsambigousforarraystemplateinlinevoidoperator&(T*p){cout是否有任何好的和干净的解决方案来实现运算符对任意数组和任意指

c++ - 如果模板参数确实如此,则仅重载运算符

给定一个带有单个模板参数T的模板类A,是否可以仅重载A中可用于类型T的运算符?例如:templateclassA{public:#ifhasOperator(T,+=)T&operator+=(constT&rhs){mValue+=rhs;returnmValue;}#endifprivate:TmValue;}intmain(){Aa;a+=8;//+=willforwardtothe+=fortheintstructTest{/*nooperatorsdefined*/};Ab;//+=isnotimplementedsinceTestdoesnotimplement+=}我正在

c++ - 实例化函数模板的编译问题

考虑以下代码:#includestructS{voidf(constchar*s){std::coutvoidinvoke(S*pd,Args...args){(pd->*mem_fn)(args...);}intmain(){Ss;void(*pfn)(S*,constchar*)=invoke;pfn(&s,"hello");}编译代码时,clang报错如下:main.cpp:16:33:error:addressofoverloadedfunction'invoke'doesnotmatchrequiredtype'void(S*,constchar*)'void(*pfn)(S

c++ - 包括多个编译单元中的模板代码,它会一直链接而不是内联吗?

假设我在MyHeader.h中有模板代码,然后包含在2个编译单元中,A.cpp和B.cpp.然后这两个文件实例化相同的模板函数,比如f();(后者在MyHeader.h中定义了非内联)。据我所知,发生的事情如下。编译器生成f();的代码在两个A.obj和B.obj,然后喜欢者在链接阶段丢弃其中一个符号。我的问题:这种方法总是“安全”的吗?即,是否有链接器会提示重复符号?标准对此有任何说明吗?如果是,那么我看不到任何解决方案来制作我的所有模板函数inline. 最佳答案 这始终是安全的并且包含在ODR中。§3.2/6:Therecan

c++ - 模板类的模板友元函数

我有以下模板类和模板函数,它们旨在访问类的私有(private)数据成员:#includetemplateclassMyVar{intx;};templatevoidprintVar(constMyVar&var){std::coutvoidscanVar(MyVar&var){std::cin>>var.x;}structFoo{};intmain(void){MyVara;scanVar(a);printVar(a);return0;}将这两个函数声明为MyVar的友元函数,我在templateclassMyVar的声明中尝试了以下方法宣告友元。它们都不起作用。我该怎么办?temp