草庐IT

泛型、Trait 和生命周期(上)

目录1、提取函数来减少重复2、在函数定义中使用泛型3、结构体定义中的泛型 4、枚举定义中的泛型5、方法定义中的泛型6、泛型代码的性能每一门编程语言都有高效处理重复概念的工具。在Rust中其工具之一就是 泛型(generics)。泛型是具体类型或其他属性的抽象替代。我们可以表达泛型的属性,比如它们的行为或如何与其他泛型相关联,而不需要在编写和编译代码时知道它们在这里实际上代表什么。首先,我们将回顾一下提取函数以减少代码重复的机制。接下来,我们将使用相同的技术,从两个仅参数类型不同的函数中创建一个泛型函数。我们也会讲到结构体和枚举定义中的泛型。之后,我们讨论 trait,这是一个定义泛型行为的方法

c++ - std::iterator_traits libstdc++ 和 libc++ 之间的分歧

给定:structIter{usingvalue_type=int;usingdifference_type=int;usingreference=int;usingpointer=int;usingiterator_category=int;};以下代码适用于libstc++,但无法针对libc++5.0.0进行编译:#include#includestatic_assert(std::is_same::iterator_category,Iter::iterator_category>::value,"");出现错误:error:nomembernamed'iterator_cat

模板化类型的 C++ 模板特化

我希望通过使用BOOST_STATIC_ASSERT来帮助使用我的一些模板代码的用户,让他们知道他们使用了一个不兼容的类型,其编译错误消息比当前使用不兼容类型生成的怪物更简单。该示例有点太复杂,无法在此处重现,但希望这能捕获我想要的本质:我的问题是如何格式化最后一行“模板模板”?templateclassInterestingType{}templatestructis_interesting_type{staticconstboolvalue=false;};templatetypenameInterestingType>//Noideahowtoformatthis..struct

c++ - 将模板专门化为嵌套类类型

有没有专门针对嵌套类的特征模板?我已经在下面提到的三个地方试过了,每个地方都有给定的错误。我已经看到有关专门化嵌套模板类的问题,但这不是我在这里尝试做的——我正在尝试专门化嵌套类使用的特征类。TraitUser类使用Trait中的定义作为特定类型T的特化。也许最相关的是,它使用trait成员来初始化基类。templateclassTraitUser:publicX::Type>{//Traitgetsusedinhere};//classA;//classA::B;//structTrait//{};classA{private://classB;//template//{};clas

c++ - 声明是否可以转义其封闭的 namespace ?

我正在尝试编写一个宏来帮助构建具有各种辅助函数的enumclass,例如用于转换为字符串。在某种集合中提供对枚举的所有值的访问是很自然的:DEFINE_ENUM(Foo,Value1,Value2);for(Foov:enum_traits::all_values){//...}这似乎可以通过使DEFINE_ENUM()宏专门化一个通用的enum_traits类来实现://globally:templatestructenum_traits{};//insidethemacro:#defineDEFINE_ENUM(Name,...)\/*define"enumclassName"..

c++ - 从lua文件获取简单值到c++的通用解决方案

我正在尝试使用Lua文件作为配置或ini。我成功了,但我的解决方案激怒了我。具体来说,get_double,get_int和get_string功能需要以可重用的方式完成。我在创建没有参数的函数模板时遇到了问题。另外,我不确定如何概括lua_is...和lua_to....我的想法是给我们if(is_same::value)return(double)lua_isnumber(L,-1);但它没有用。这是工作代码:主.cc:#include#includeusingnamespacestd;classLua_vm{private:lua_State*L;public:doubleget

c++ - 有没有更好的方法来检查 STL 容器是否是多*容器

在为适用于各种标准C++11容器的框架编写单元测试期间,我跨过了我想以通用方式创建测试数据的问题。这里我需要知道关联容器C是否是multi*容器。例如。如果C是std::set或std::multiset。我搜索了所有这些容器的接口(interface),它们的共同点是它们都有一个insert(value_typeconst&)方法。但从我的角度来看,显着的区别在于multi*版本只返回一个迭代器,而“非”multi*版本返回一个std::pair。所以我选择这个作为差异化因素。我的结果代码是:#include#includetemplateclassis_multi_containe

c++ - 类型别名和不完整的类型

我可能已经超出了解决本应是一个简单问题的范围。我在这里开始这个问题:Gettingtypeofbaseclassatcompiletime基本上我试图让类管理它自己的指针类型。我正在包装一个C库,其中一些结构中嵌入了引用计数,而另一些则没有。那些没有的,我想使用shared_ptr。那些这样做,我想使用intrusive_ptr。我想避免依赖程序员的智慧来确保使用正确的包装器。最终,我想添加更多依赖于此行为的功能,但我还没有做到这一点。@Yakk提出了一个使用模板类型别名的有趣解决方案,我已经尝试实现它。不幸的是,我让自己陷入了一个似乎无法解决循环引用以使编译器满意的境地。我收到指向“

c++ - boost库中的以下定义是什么意思

我正在研究内部的boost库,对以下定义感到困惑:namespaceboost{namespacecontainer{template,typenameA=std::allocator>classbasic_string;templatebasic_stringbasic_string&&operator+(basic_stringbasic_string&&mx,constbasic_string&y);类型的含义是什么basic_stringbasic_string&&mx?这与longlongint相似吗?类型?这是boost引用链接:boost1.48.0

C++ 在 ‘value_type’ 中没有名为 ‘struct std::iterator_traits<int>' 的类型

你好。我正在尝试运行以下代码(仅用于培训目的):#include#includetemplate>classkont>typenamestd::iterator_traits::value_typefoo_test(typenamekont::iteratorb){return*b;}templatetypenamestd::iterator_traits::value_typeminimum(Iterb,Itere){Iterm=b;/*CODE*/return*m;}intmain(void){std::listx;x.push_back(10);x.push_back(100);