什么时候将特征作为模板参数传递而不是简单地使用一些现有的特征结构如typedefbasic_ofstream>对比typedefbasic_ofstream?我有一些tile类,我希望它们有一些共同点(特征),所以我设计了tile_traits包含有关图block的所有基本信息,例如int_type和flag_type,像这样://unspecializedtemplatestructtile_traits;//...otherstuffhere,declarationofatileclasstemplatestructtile_traits{typedeftile_class::in
我正在阅读ScottMeyers的EffectiveC++.他在谈论特征类,我知道我需要它们在编译期间确定对象的类型,但我无法理解他对这些类的实际作用的解释?(从技术角度) 最佳答案 也许您期待某种让类型特征发挥作用的魔法。在那种情况下,请失望——没有魔法。类型特征是手动为每种类型定义的。例如,考虑iterator_traits,它为迭代器提供typedef(例如value_type)。使用它们,你可以写iterator_traits::iterator>::value_typex;iterator_traits::value_ty
是否可以使用编译器命令行选项来防止静态常量成员优化?这是一个例子:templatestructTRAITS{staticconstunsignedval1=v1;};templatestructfoo{staticconstunsignedx1=TRAITS::val1;};intmain(){foo>f1;//SETBREAKPOINTHEREreturn0;}编译:g++-g-O0optimize_out.cppGDB:gdba.out(gdb)breakoptimize_out.cpp:13(gdb)r(gdb)pf1$1={staticx1=}这段代码的特殊之处在于类是模板。可
我没有使用C++的经验,并且获得了一个应该能够在没有任何调试的情况下运行的代码,但是,当我尝试编译它时出现了一堆错误。我只需要一些关于如何开始调试它的指导,我们将不胜感激。这是错误消息:mpicc-c-O3curvilinear_grid.cppInfileincludedfromparameters.h:12:0,fromcurvilinear_grid.h:13,fromcurvilinear_grid.cpp:6:parameter_file_parser.h:Inmemberfunction‘intPARAMETER_FILE_PARSER::Parse_Parameter_F
今天我尝试实现基数排序。该函数必须有两个变量:开始迭代器和结束迭代器,并且可以有第三个:一些必须返回整数类型以进行排序的函数。默认情况下,它必须是恒等函数。我的尝试看起来像(抱歉,代码看起来又长又脏,但这只是一个尝试):templatevoidradix_sort(ForwardItfirst,ForwardItlast,std::function::value_type)>get_value=[](consttypenamestd::iterator_traits::value_type&x){returnx;}){//...}get_value的返回类型当然会在编译时知道。用法应该
我有一个关于C++0xlambda的问题。在我的代码中,了解给定类型是否是C++0xlambda表达式的类型将是有益的。举个例子:structfoobar{voidoperator()(){}};autolambda=[]{};typedefis_lambda::typeT;//Twouldbeatrue_typetypedefis_lambda::typeT;//Twouldbeafalse_type将lambda表达式与函数和成员函数类型区分开来相当容易。仿函数是另一回事。我在这里看到的问题是根据即将到来的C++0x标准定义lambda表达式;唯一必须定义的是公共(public)调
例如,我想使用类型T仅当std::is_pointer和std::is_const评估为true_type.当然还有一个简单的方法是这样的:templatevoidf(Tt,std::true_type,std::true_type){}templatevoidf(Tt){f(t,std::is_pointer{},std::is_const{});}但是我想要这样的东西:templatevoidf(Tt,std::true_type){}templatevoidf(Tt){f(t,std::and,std::is_const>{});}标准库是否包含类似std::and的内容??如果
设置当你想让迭代器在返回之前处理它们正在迭代的内容时,boost::transform_iterator都不错。您向它们传递一个一元函数,该函数转换底层迭代器的operator*()的结果。然后转换迭代器返回:templatestructiterator_transform_traits_map_second{typedeftypenameMap::value_typevalue_type;typedeftypenameMap::mapped_typeresult_type;result_type&operator()(value_type&v)const{returnv.second
假设我们有两个类,A和B。当使用组合来建模“has-a”或“is-implemented-in-terms-of”关系时(例如Bhas-aA),与继承相比的缺点之一是B不包含A的公共(public)功能它需要。为了访问A的公共(public)函数,有必要提供转发函数(与继承相反,其中B将继承所有A的公共(public)功能)。举一个更具体的例子,假设我们有一个Person,它有一个ContactInfo:usingnamespacestd;classContactInfo{public:ContactInfo();voidupdateAddress(stringaddress);voi
现代STL中有std::is_base_of。它允许我们确定第二个参数是否派生自第一个参数,或者它们是否是相同的类,否则,确定它们之间是否没有这种关系。是否可以在不区分其特化涉及哪些具体实际参数的情况下确定一个类是否派生自某个具体模板类?说,我们有;templatestructB{};和templatestructD:B{};是否可以定义类型特征:templateis_derived_from_B;当T是D的任何特化并从std::派生时,它从std::true_type派生:false_type如果T不是从B的任何特化派生的? 最佳答案