草庐IT

c++ - C++ 模板是否能够从父类获取 "forward any class function"?

classFoo{public:voidmethodA();};classManagedFoo{FoofooInst;public:voidmethodA(){doSomething();fooInst.methodA();}};现在我想把ManagedFoo做成一个模板,管理任何类而不仅仅是Foo,并且在调用Foo的任何函数之前,先调用doSomething。templateclassManager{_TyManaged_managedInst;voiddoSomething();public:/*Forwardeveryfunctioncalledby_managedInst*//

c++ - 我可以在不重复签名的情况下实例化模板吗?

我想实例化一些带有长签名的函数:templatevoidfoo(T&t,SomeTypesome_parameter,AnotherTypeanother_parameter,EtcTypeyet_another_parameter,AsYouCanTellthis_is_a_very_long_signature);实例化foo的直接方法是:templatevoidfoo(int&t,SomeTypesome_parameter,AnotherTypeanother_parameter,EtcTypeyet_another_parameter,AsYouCanTellthis_is_

c++ - std::make_pair、c++11 和显式模板参数

这个问题在这里已经有了答案:C++11make_pairwithspecifiedtemplateparametersdoesn'tcompile(1个回答)关闭7年前。重新编辑:首先,这只是一个好奇的问题,我知道,std::pair或许多其他解决方案可以根除这个问题。你能告诉我,下面这个问题的背后究竟是什么吗?此代码是一个在c++03上运行但在c++11上失败的简单示例。std::pairgetsth(int*param){returnstd::make_pair(param,0);}intmain(intargc,char*argv[]){int*a=newint(1);std::

c++ - 了解别名模板

我问了一个question有几个对代码的引用:templateusingvoid_t=void;我相信我有一个普遍的误解aliastemplates:您为什么不评估您传递给enable_if_t中的别名模板的任何模板参数?或conditional_t声明?上面的代码只是做一个enable_if_t吗?一次处理多个模板参数?其次,我认为我对void_t的作用有特定的误解。.Thiscomment声明C++17标准定义了void_t.这是我没有得到的:不是void_t只是一个随意的名字?如果我仍然必须定义templateusingvoid_t=void;无论我打算使用void_t标准化任意

具有多个约束的 C++ 模板

在C#中,我习惯于在泛型方法或类型中指定多个约束,如下所示:HowdoIspecifymultiplegenerictypeconstraintsonasinglemethod?今天我第一次开始使用C++,在谷歌搜索模板多重约束时我无法找到任何有用的东西。看起来这是不可能的,每个人都知道,因此没有问题。我知道在C#中,编译器对泛型的验证比在C++中要强得多,这就是为什么我觉得不能将我的类型限制为多个父类(superclass)型是不对的。 最佳答案 这在今天的C++中是可能的,但语法相当复杂。在下一个主要的C++版本中,我们很可能会

C++ 模板特化和派生

当使用这样的模板时:classA{…}classB:A{…}classC:A{…}templateclassD{…}我需要T只能是B或C。这意味着T必须是A的派生。有什么办法吗?谢谢! 最佳答案 将std::is_base_of与std::enable_if一起使用:template::value>::type>classD{...}请注意,它会接受任何T,只要它派生自A。如果你需要T是B或者C,那么你需要修改它,使用std::is_same或/和std::conditional以及std::enable_if。你可以把它清理成:t

c++ - 调用父构造函数时如何避免模板参数上的样板

假设我有一个带有很多模板参数的类,其中之一是使用CRTP的派生类:templateclassBaseFoo{public:BaseFoo(A&a){}};我想继承它:classDerivedFoo:publicBaseFoo{public:DerivedFoo(A&a):BaseFoo(a){}};是否有任何技巧可以避免提及所有显式模板参数?如果我仍然必须声明Derived作为模板参数也没关系。 最佳答案 如果基类是依赖的,只需使用派生类的名称并在其中查找基类名称。如果它不依赖,您可以将基类命名为不合格的,因为它在范围内。不需要所有

c++ - 在 C++11 中,我可以引用在模板参数中定义的枚举类吗

这是我尝试编写的代码的简化版本:templateclassStateMachine{public:voidSetState(Derived::States){static_cast(this)->TransitionTo(s);}};classMyFSM:publicStateMachine{public:enumclassState{State1,State2,State3};voidTransitionTo(States){_state=s;}private:State_state=State::State1;};我正在使用带有clang的c++11。我在这里得到的错误是10:17

c++ - 我可以在这里避免模板递归吗?

我为元组写了一个for_each:templateenable_if_t::valuefor_each(Tuple&,F&&){}template::value>enable_if_t::value>=end>for_each(Tuple&t,F&&f){f(get(t));for_each(t,forward(f));}[LiveExample]但是Yakk'sanswertothisquestion给出了一个很好的例子,说明如何处理在所有tuple值上运行lambda非递归:namespacedetail{templatevoidfor_each_arg(F&&f,Args&&..

c++ - 如何用模板参数包的内容填充数组?

在我发现itwasnotstandards-compliant之前,我嵌套了与VS2015一起使用的部分专用模板代码。.我希望它是这样的,所以我扭曲了我的代码来克服前一个问题以及thatone现在碰壁了。使用可变参数模板和部分特化,我想在编译时给定一组固定参数来填充一个数组。我想要实现的目标似乎也类似于thisanswer但我没能成功。考虑以下程序:#includetemplatestructArray;templatestructArrayFiller{inlinestaticvoidfill(Array&a,constArgs&...args){ArrayFiller::fill_