草庐IT

dynamic-invoke

全部标签

c++ - 为什么 C++ 编译器不从最终类优化这个 dynamic_cast?

考虑这个类层次结构:structAnimal{virtual~Animal();};structCat:virtualAnimal{};structDogfinal:virtualAnimal{};我的理解是,将final放在classDog上可以确保没有人可以创建继承自Dog的类,这必然意味着没有人可以同时创建一个IS-ADog和IS-ACat的类。考虑这两个dynamic_cast:Dog*to_final(Cat*c){returndynamic_cast(c);}Cat*from_final(Dog*d){returndynamic_cast(d);}GCC、ICC和MSVC忽

c++ - C++ 中 dynamic_cast 的真实示例

谁能给我一个真实世界的例子,说明需要dynamic_cast并且根本无法解决的情况?我能想到的示例通常可以通过双重调度来解决。如果约束太强,通常采用dynamic_cast的示例也是不错的选择。我希望看到真实的例子,而不是“它通常用于在类型树上下类型之间进行转换”。 最佳答案 双重分派(dispatch)要求正在交互的类型对彼此的内部有深入的了解,因为它要求一个类调用另一个类的方法。dynamic_cast适用于您无法修改类的内部结构或不希望破坏相关类的封装。也就是说,双重调度对所涉及的类具有侵入性,而dynamic_cast在不知

c++ - 为什么我要使用 dynamic_cast 强制转换为 void *?

所以我正在阅读dynamic_castfrom"void*"的答案尽管您不能从void*转换为T*一些响应指出可以转换T*到void*,但不要给出任何指示为什么你想这样做。这只是可能的琐事,还是有可能有意义的情况?我考虑过可能是为了可读性或明确我们正在转换为void*,但考虑到dynamic_cast的目的,它不太适合我。就此而言,除了让T*隐式变为void*之外,还有什么理由去做吗?我已经看到不时使用C风格强制转换为void*code>指向一个指针或其他东西)。 最佳答案 首先,使用dynamic_cast(x)时你会得到一个指向

c++ - 使用 Q_INVOKABLE 将 C++ 与 QML 连接起来

我有一个Qt函数:voidMainWindow::button_clicked(Qstringa,Qstringb,Qstringc,Qstringd)我从QML收集数据,我想将数据传递给Qt中的这个函数。所以我知道我需要使用Q_INVOKABLE但不知道如何使用它。另外一件事是在调用上面的某个函数时可以调用其他函数。例如:我调用了上面的函数,但在她的body里我调用了refresh()函数。这可能吗? 最佳答案 为了能够从QML调用方法,您必须使用Q_INVOKABLE或将其标记为插槽。如果Q_INVOKABLE不打算用作插槽,我

c++ - 何时使用 std::invoke 而不是简单地调用可调用对象?

据我了解,std::invoke允许我执行以下操作:std::invoke(f,arg1,arg2,...);有没有比单纯做更有优势的场景:f(arg1,arg2,...); 最佳答案 如果invocable是指向成员函数的指针,那么您需要执行以下操作之一:(arg1->*f)(arg2,...);(arg1.*f)(arg2,...);取决于arg1是什么。INVOKE(及其官方库对应的std::invoke)几乎就是为了简化这种困惑而设计的。您将使用std::invoke来支持您的代码调用者传递any可调用,而不必使用lambd

c# - C++ 和 C# 互操作性 : P/Invoke vs C++/CLI

在寻找C#和C++之间互操作方法的过程中,我发现了article这解释了P/Invoke。我读了很多文章,声称C++/CLI不是完全的C++,需要一些努力来修改原始C++代码。我想问当我有一些我想从C#对象中使用的C++对象(代码/数据)时,最佳方式是什么。看来,为了使用P/Invoke,我应该提供C风格的API。这是真的吗?我的意思是,有没有办法将C++对象导出到C#,比如带有P/Invoke的SWIG?或者,我是否必须为此使用SWIG?将C++更改为C++/CLI有多难?与将C++重写为C#相比,是否值得尝试?C++设计得很好,所以用C#实现它并不是什么大问题。(题外话)有没有反过

时间:2019-05-01 标签:c++: dynamic number of nested for loops (without recursion)

我正在编写一个遍历n位数字的每个排列的代码段。例如,如果n=3,我想遍历以下每个元素:0,0,0...0,1,0...1,0,0...2、3、4...9、9、9使用嵌套的for循环很容易编写代码:for(digit10to9)for(digit20to9)for(digit30to9)但我想将其概括为n位数。例如,如果n=10,我现在需要10个嵌套的for循环。我已经考虑过这一点,并意识到可以使用递归来解决这个问题(深度优先搜索一棵树,每个节点有10个子节点,从0到10,并在深度n处停止)。但我的目标是高性能,所以我不想因为开销而使用递归。我还有什么其他选择?

c++ - 与 dlopen/dlsym 一起使用时 dynamic_cast 失败

简介让我为这个冗长的问题提前道歉。它尽可能短,不幸的是,它不是很短。设置我定义了两个接口(interface),A和B:classA//Aninterface{public:virtual~A(){}virtualvoidwhatever_A()=0;};classB//Anotherinterface{public:virtual~B(){}virtualvoidwhatever_B()=0;};然后,我有一个共享库“testc”,它构造C类的对象,实现A和B,然后传递指向它们的A接口(interface)的指针:classC:publicA,publicB{public:C();~

c++ - boost::dynamic_bitset 比 std::bitset 慢,除非 std::bitset 被重置

我最近遇到了bitset模板,我真的很想在我当前的项目中使用它们。继续阅读,我看到std::bitset模板的大小必须在编译时确定。许多人建议使用boost::dynamic_bitset来缓解这个要求。为了比较两者,我决定对set、flip和count方法进行速度比较。结果很奇怪......我想知道是否有人可以为我解释一下。代码在帖子的末尾,但我会在这里解释我在做什么。我有一个std::bitset对象(称为bs)和一个boost::dynamic_bitset对象(称为dynbs)。每个都有n=1000000位。对于上面的给定方法,依次调用每个n位的方法并重复此R=10000次。使

c++ - 符合标准的编译器可以拒绝包含来自非多态类型的 dynamic_cast downcast 的代码吗?

这个问题的灵感来自评论here.考虑以下代码片段:structX{};//novirtualmembersstructY:X{};//mayormaynothavevirtualmembers,doesn'tmatterY*func(X*x){returndynamic_cast(x);}一些人建议他们的编译器会拒绝func的正文.但是,在我看来,这是否由标准定义取决于x的运行时值。.来自第5.2.7节([expr.dynamic.cast]):Theresultoftheexpressiondynamic_cast(v)istheresultofconvertingtheexpres