You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以最少样板代码优化dynamic_cast代码生成,生成高效等价代码?

优化代码生成器的类型转换性能问题

我开发了一款基于模板的代码生成器,当前生成的代码是dynamic_cast<B&>(p).eval(),但这段代码存在性能开销。我希望生成等价的高效代码static_cast<C<X>&>(p).eval(),但需要在运行时获取必要的类型信息(例如字符串C<X>)。

代码示例

#include<iostream>
#include<string>
#include"lib_typename.hpp" // template<typename T> typename_of<T>() returns string "T"; cf., e.g., in Boost

struct X;

struct A{
    virtual std::string my_typename()const{ return typename_of<A>(); }
    virtual ~A(){};
};

struct B{
    virtual std::string my_typename()const{ return typename_of<B>(); }
    virtual void eval()=0;
};

template<typename T>
struct C: A,B{
    virtual std::string my_typename()const{ return typename_of<C<T>>(); }
    void eval(){} 
};

int main(){
    C<X> c;
    A& p = c;
    
    dynamic_cast< B& >(p).eval();   // <-- 可生成但性能慢
    static_cast< C<X>& >(p).eval(); // <-- 性能快,但需获取字符串"C<X>"
    
    // 可能的类型信息获取方式:
    std::cout << p.my_typename() << "\n";     // 需要大量样板代码
    std::cout << typeid(C<X>).name() << "\n"; // 返回难以识别的内容
}

已知条件与需求

  • 代码生成时已知A& p指向B的非抽象派生类
  • 目前倾向于使用样板代码方案,但希望找到样板代码更少的实现方式
  • 也接受无需识别C<X>字符串的替代解决方案
  • 注:添加模板参数X是为了说明,仅寻找A和B的首个公共继承类无法解决问题

内容的提问来源于stack exchange,提问作者user22056011

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:07:04