草庐IT

static_casting

全部标签

c++ - sibling 的 dynamic_cast 的用例是什么?

我正在阅读ScottMeyers的《更有效的C++》。教化!Item2提到dynamic_cast不仅可以用于向下转换,还可以用于兄弟转换。任何人都可以提供一个(合理的)非人为的例子来说明它对sibling的用法吗?这个愚蠢的测试按它应该打印0,但我无法想象任何用于此类转换的应用程序。#includeusingnamespacestd;classB{public:virtual~B(){}};classD1:publicB{};classD2:publicB{};intmain(){B*pb=newD1;D2*pd2=dynamic_cast(pb);cout

c++ - 线程错误 : invalid use of non-static member function

这个问题在这里已经有了答案:Passingmemberfunctionstostd::thread[duplicate](2个答案)关闭5年前。我想了解C++中的线程,但我不知道如何解决这个问题。我想调用两个线程来运行名为“createS”的函数,但出现此错误:error:invaliduseofnon-staticmemberfunction我读过关于这个主题的其他问题,但我真的不明白如何让我的代码工作。有人可以向我解释我做错了什么并尝试帮助我找到解决方案吗?test_class.cppvoidtest_class::generateS(){map1=newmultimap>;map

c++ - 使用 C++ 样式转换从 Void* 转换为 TYPE*​​ : static_cast or reinterpret_cast

因此,如果您从Void*转换为Type*或从Type*转换为Void*,您应该使用:voidfunc(void*p){Params*params=static_cast(p);}或voidfunc(void*p){Params*params=reinterpret_cast(p);}对我来说static_cast似乎更正确,但我已经看到两者用于同一目的。此外,转换的方向是否重要。即我是否仍应将static_cast用于:_beginthread(func,0,static_cast(params)我已经阅读了关于C++样式转换的其他问题,但我仍然不确定这种情况下正确的方法是什么(我认为

c++ - 将 CRTP 与 static_assert 一起使用时出现编译器错误

考虑以下代码:templatestructBase{staticconstexprintx_base=Derived::x_derived;//static_assert(x_base>1,"Oops");};structDerived:publicBase{staticconstexprintx_derived=5;};Baseobj;这在gcc上编译得很好,但如果我取消注释static_assert行,它会提示error:incompletetype'Derived'usedinnestednamespecifierstaticconstexprintx_base=Derived:

c++ - 链接 : Static vs Dynamic

在我的应用程序中,我有3个主要部分:Exe:一个可执行文件Lib_A:一个库包含一个单例类和一个基类,用于在单例中使用一些计算类Lib_B:一个库包含许多从Lib_A中派生的类我在Lib_B中有派生类的原因是,我想在运行时从Exe编译Lib_B。我需要在计算期间生成派生类而不终止整个系统。这对我来说太重要了。这意味着最初我可能会说动态加载Lib_B1,我也可能将其他版本的Lib_B编译为Lib_B2、Lib_B3、Lib_B4等,并动态加载它们。所有Lib_Bx库都将具有入口点函数以导出其中的类。所以考虑到以下事实:在运行时会有不同数量的文件共享同一个Lib_A。应用程序必须在Wind

c++ - 重新定义 malloc/free with static linking has multiple definition error

我公司最近想把编译器从gcc-3.4更新到gcc-4.5。但是,我们客户的机器可能没有最新的libstdc++.so,所以我们想静态链接我们的二进制文件。我们的程序需要定制的malloc()/free()以满足非常高的性能要求。我修改了makefile,在链接时添加了一个-static,得到了以下错误信息:/usr/lib64/libc.a(malloc.o)(.text+0x18c0):Infunction`free'::multipledefinitionof`free'../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thre

c++ - 从 Derived* 到 void* 到 Base* 的 static_cast

我想将指向派生类成员的指针转换为void*,然后从那里转换为基类的指针,如下例所示:#includeclassBase{public:voidfunction1(){std::cout(&d);Base*baseptr=static_cast(ptr);baseptr->function1();baseptr->function2();}这会编译并给出所需的结果(分别打印1和2),但它能保证工作吗?我在这里找到的static_cast的描述:http://en.cppreference.com/w/cpp/language/static_cast只提到转换为void*并返回到指向相同类

C++:Cast 运算符重载和引用

C++允许通过创建operatorT()来重载类型转换,其中T是我们要转换为的类型。现在,这个功能如何与引用一起发挥作用?例如:structY{inti;};structX{Yy;operatorY()const{returny;}};在这里,我们可以将X转换为Y,这将简单地返回包含的Y。但是,如果我们想转换为Y引用怎么办?例如,C++允许我们这样做:structX{Yy;operatorY&(){returny;}operatorconstY&()const{returny;}};现在,我们可以将X转换为Y引用或const引用(这也适用于constX)。第一个和第二个例子在语义上有什

c++ - 什么是 (void*) casting?

我确实尝试在StackOverflow上搜索此内容,但我认为由于语法原因以及不知道要搜索的确切内容,我有点不知所措。我见过(void*)被用来转换,通常是函数调用。这是做什么用的? 最佳答案 void*,通常称为void指针,是一种通用指针类型,可以指向任何类型的对象。指向不同类型对象的指针在内存中几乎相同,因此您可以使用void指针来避免类型检查,这在编写处理多种数据类型的函数时非常有用。空指针在C中比在C++中更有用。您通常应该避免使用void指针,而是使用函数重载或模板。类型检查是个好东西!

c++ - static_cast<T> 对 T& 做了什么?

所以我问了thisquestion我正在尝试通过static_cast解决它。(顺便说一句,它确实解决了问题,我只是不确定我是否理解为什么。)在代码中:vectorfoo={0,42,0,42,0,42};replace(begin(foo),end(foo),static_cast(foo.front()),13);static_cast是否只是构造一个R值int?那和只是打电话有什么区别:replace(begin(foo),end(foo),int{foo.front()},13);编辑:根据答案static_cast的推断,确实似乎构造了一个R值int:http://ideon