草庐IT

C++ 表达式模板生命周期

我在https://en.wikipedia.org/wiki/Expression_templates查看表达式模板的示例.然后我尝试制作一个简单的符号表达式树,即添加常量和变量,如a+b+10。所以我从#includetemplateclassExpression{public:std::ostream&print(std::ostream&os)const{returnexpression().print(os);}Econst&expression()const{returnstatic_cast(*this);}};classVar:publicExpression{publ

c++ - 使用任意类型的给定参数进行任意操作的任何建议?

基本上我只想使用任意类型的给定参数进行任意操作。参数类型基类是Var,Operation是将对给定参数执行的操作的基类。我有Evaluator类,它包含一组使用opId映射的运算符。Evaluator将根据evaluate()成员函数中给出的opId参数进行操作,然后evaluate()函数将搜索支持的运算符,这些运算符将接受参数类型和opId。我想问的是,是否有任何有效的模式或算法可以做到这一点无需dynamic_cast和/或循环运算符集合。`classVar{public:boolisValidVar();staticVarinvalidVar();}templateclassV

c++ - 'auto' 关键字如何知道何时使用 const_iterator 匹配函数重载?

我了解thisquestion的内容但是当使用函数重载时,事情是如何工作的呢?例如在std::map中定义了以下方法:iteratorfind(constkey_type&k);const_iteratorfind(constkey_type&k)const;如何使用auto关键字来选择一个或另一个?以下内容对我来说似乎不正确:autoi=mymap.find(key);//callsthenon-constmethod?constautoi=mymap.find(key);//callstheconstmethod? 最佳答案 s

c++ - ‘const’ 错误之前的预期主表达式

请帮忙。我收到很多错误。sub2.cpp:在函数“intmain()”中:sub2.cpp:11:14:错误:从‘constchar*’到‘char’的无效转换[-fpermissive]sub2.cpp:12:14:错误:从‘constchar*’到‘char’的无效转换[-fpermissive]sub2.cpp:16:17:错误:'const'之前需要主表达式sub2.cpp:16:36:错误:'const'之前需要主表达式sub2.cpp:11:6:警告:未使用的变量“外部”[-Wunused-variable]sub2.cpp:12:6:警告:未使用的变量‘inner’[-W

c++ - 使用内联的显式模板函数实例化

因此,我和一位同事一直在讨论显式模板实例化在减少编译时间、将声明与定义分开以及不影响我编写的用于其他项目的C++数学库的性能方面的好处。本质上,我有一个有用的数学函数库,旨在与Vector3、Vector4、Quaternion等原语一起使用。所有这些都用于模板参数为float或double(在某些情况下为int).这样我就不必将这些函数写两次,一次用于float,一次用于double,函数实现是模板化的,如下所示:templateVector3foo(constVector4&a,constQuaternion&b){dosomething...}全部在.h文件中定义(因此它们被隐式

c++ - 当底层 OpenGL 状态被修改时,我是否应该声明一个方法 const

下面的类封装了缓冲区的OpenGL名称,并提供了一些改变缓冲区状态的方法:classBufferObject{public:explicitBufferObject(GLenumtype);virtual~BufferObject();//somemethodsomittedvoiddataStore(GLsizeiptrsize,constGLvoid*data,intusage);void*mapBufferRange(GLintptroffset,GLsizeiptrlength,intaccessFlag);voidunmapBuffer()const;private:GLui

c++ - 使用对 const char * 的右值引用的重载解析

#includeusingnamespacestd;voidf(constchar*const&s){cout输出:rvaluervalue为什么输出不是“右值左值”? 最佳答案 字符串文字和s都不是指针(它们是数组),因此标准的相关部分是[conv.array]:Anlvalueorrvalueoftype"arrayofNT"or"arrayofunknownboundofT"canbeconvertedtoaprvalueoftype"pointertoT".Theresultisapointertothefirsteleme

c++ - 有 const 构造函数这样的东西吗?

今天我不小心把const放在我的构造函数的开头(复制粘贴错误)并且它编译了。我只在C++11之前的VisualStudio2008中试过这个。这个语法有什么意义吗?这是微软在constexpr上的早期尝试吗?classfoo{public:constfoo(inti){}};foof(1); 最佳答案 您的代码不符合标准,没有这样的东西。但是,从C++11开始,您可以拥有constexpr构造函数,因此您的对象是在编译时构造的,并且可以进一步在constexpr表达式中使用。虽然我没有使用它,但就标准合规性而言,MSVS并不是最好的

c++ - 实现比较运算符的模板类

将所有重载的比较运算符写入一个类是我的一项常见任务,因此我编写了一个模板类,如果派生类实现了==和=,!=.它正在工作,但具有很多转换和不那么明显的“奇怪的重复模板模式”,所以我想知道是否有更简单的解决方案?templateclassComparable{public:booloperator!=(constComparable&other){return!(static_cast(this)->operator==(*static_cast(&other)));}booloperator&other){return(static_cast(this)->operator==(*sta

c++ - 2 个重载具有相似的转换 - 内置运算符 integer[pointer-to-object]

我有以下类(class):classDictionaryRef{public:operatorbool()const;std::stringconst&operator[](std::stringconst&name)const;//...};然后我尝试使用它:DictionaryRefref=...;ref["asdf"];//error输出提示两个重载,但只列出一个:1>...:errorC2666:'DictionaryRef::operator[]':2overloadshavesimilarconversions1>...:couldbe'conststd::string&D