草庐IT

c++ - 在 switch 语句中使用类类型 : is it better than using typeid operator?

我在下面看到了有关C++标准$6.4.2中switch语句的内容。Switch语句可以带一个条件。Theconditionshallbeofintegraltype,enumerationtype,orofaclasstypeforwhichasingleconversionfunctiontointegralorenumerationtypeexists(12.3).Iftheconditionisofclasstype,theconditionisconvertedbycallingthatconversionfunction,andtheresultoftheconversion

c++ - typeid() 面向对象的设计替代方案

我有以下使用3个不同映射的类:键始终是字符串,而值可以是字符串、整数或float。classMyMaps{public:templatevoidaddKey(conststd::string&key);voidaddValue(conststd::string&key,conststd::string&value);voidaddValue(conststd::string&key,intvalue);voidaddValue(conststd::string&key,floatvalue);private:std::mapstringFields;std::mapintFields;

c++ - 如何预测具有符号数字类型的东西?

假设我有一些执行以下操作的模板化代码:Tx=foo();Ty=-x;现在,如果T是非数字类型(或者没有实现一元负号),编译将简单地失败。但如果是unsignedint、unsignedshort等,它会成功,但会出现警告。所以我希望能够做到Tx=foo();if(/*magiccondition*/{Ty=-x;}我能否写出T的类型是某种有符号数字类型的条件(在编译时或运行时检查)?例如使用typeid?注意:断言也不错,但我想要更灵活的东西。 最佳答案 C++11具有is_unsigned特性,您可以在static_assert中

c++ - 在 C++ 中,类型名称的 typeid 总是在编译时求值吗?

我想检查当与类型名称(即typeid(int)、typeid(std::string)...)一起使用时,typeid在编译时被评估。为此,我在一个循环中重复了两个typeid调用的比较,并在启用优化的情况下对其进行了编译,以查看编译器是否简化了循环(通过查看执行时间,当它简化时为1us160毫秒,当它没有时)。而且我得到了奇怪的结果,因为有时编译器会简化代码,有时却不会。我使用g++(我尝试了不同的4.x版本),程序如下:#include#include#includeclassDisplayData{};classRobotDisplay:publicDisplayData{};c

c++ - c++11 中的 typeid(T).name() 替代方案?

在c++11中是否有一种标准的方法来使用一些模板黑魔法或动态地使用一些标准库函数来获取类的名称? 最佳答案 不,但你可以做一个:templatestructmeta{staticconststd::string&get_name(){returnT::class_name;}};然后将静态成员class_name添加到类中:classMyClass{public:staticconststd::stringclass_name("MyClass");};或专门化元:templatestructmeta{staticconststd:

c++ - 如何实现构造函数,使其只接受使用 typeid 的输入迭代器?

我想为某个对象实现一个范围构造函数,但我想限制它只接受两个输入迭代器。我尝试用gcc7.1.0编译这段代码。文件test.cpp#include#include#includetemplateusingtraits=typenamestd::iterator_traits::iterator_category;templateclassA{private:std::vectorv;public:template)==typeid(std::input_iterator_tag)>>A(InputIteratorfirst,InputIteratorlast):v(first,last)

c++ - 比较 typeid 指针

在这个程序中,我使用typeid来检查对象的派生类型:#include#include#include#include#includestructWrap{explicitWrap(int64_tid):mImpl(newImpl(id)){}explicitWrap(std::stringid):mImpl(newImpl(std::move(id))){}boolisInt64()const{constImplBase&impl=*mImpl;return(&typeid(impl)==&typeid(constImpl));}boolisString()const{constIm

c++ - 构造期间对象类型发生变化

我刚刚发现了以下行为:有一个B类型的对象派生自A类型,A构造过程中的最终类型是A而不是B。这可以通过以下示例观察到:#include#includeclassA{public:A(){std::cout此代码的运行(使用gcc4.8.5编译)如下:0x400ae00x400ae00x400ac0我们可以看到A::A()中typeid返回的类型是A而不是B,然后最后类型更改为B。为什么?是否有可能在父类的构造过程中知道“真正的”final类型?我的上下文如下:我有一个父类Resource和几个继承自它的类。我还有一个ResourceManager,每次创建资源时都会收到通知,并且必须知道

c++ - C++11 中唯一类型标识的最安全方法

在新标准形成期间的某处,曾promise更容易使用type_info,这导致了hash_code的实现。在C++11中实现反射系统但是我再次遇到了唯一类型标识的问题。我需要:允许我使用typeid从类型中提取唯一标识符的东西唯一标识符需要能够在键/值容器中使用标识符不需要是可移植的,甚至在程序执行之间也不需要相同请注意,我不需要程序执行之间的持久性。看起来:.name()完全没用,因为标准不对它提供任何保证。.hash_code()也是无用的,因为它不能保证是唯一的获取指向type_info对象的指针不会在任何地方都有效(例如跨DLL)只有.before()似乎有用——尽管我不知道它是

c++ - 获取变量类型

如果我没理解错的话,在多态中typeid可以确定实际的类型,而typeof则不能。他们的return是不是也有不同的用途:typeof的return作为type关键字可以定义变量,而typeid的return不可以?有没有办法既获取多态性的实际类型又使用returnastype关键字来定义另一个变量?我希望从一个指向基类的指针得到派生类的类型,并定义一个派生类的变量或指针。像这样的东西:baseclass*p=newderivedclasstypexxx(*p)*pp=dynamic_cast(p);//wouldliketoconvertthepointerfrompointingt