如何以最少样板代码优化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
相关产品推荐
相关产品推荐

