模板实例基数较小时的C++虚模板实现最佳实践问询
C++虚函数模板问题的优化方案问询
问题场景
在C++中尝试使用虚模板函数时遇到标准限制:
class Base{ public: // template<bool flag> virtual void eval()=0; // 取消注释会违反C++标准导致编译失败 }; class Derived: public Base{ public: template<bool flag> void eval(){ std::cout<<"eval<"<<flag<<">();\n"; } }; int main(){ Derived d; Base& br = d; br.eval<true>(); // 注释Base中的模板虚函数后,Base引用无法识别eval函数 }
取消注释Base中的模板虚函数(line A)会违反C++标准编译失败;保留注释则Base类型的引用无法调用Derived的eval模板函数。
现有修复方案
因模板实例仅2个(true/false),现有一种基于integral_constant的修复方案,但存在较多缺陷:
#include<iostream> class Base{ virtual void eval_impl(std::integral_constant<bool,true>)=0; virtual void eval_impl(std::integral_constant<bool,false>)=0; public: template<bool flag> void eval(){ eval_impl(std::integral_constant<bool,flag>{} ); } }; class Derived: public Base{ void eval_impl(std::integral_constant<bool,true>){ eval<true>(); } void eval_impl(std::integral_constant<bool,false>){ eval<false>(); } public: template<bool flag> void eval(){ std::cout<<"eval<"<<flag<<">();\n"; } // 此函数签名不可修改 }; int main(){ Derived d; // 不可被模板化 Base& br = d; // 不可被模板化 br.eval<true>(); // 必须支持调用true版本 br.eval<false>(); // 必须支持调用false版本 }
现有方案的缺点
- 冗余样板代码占比至少70%
- 每个模板实例对应两行样板代码
- 所有实例都会被编译,存在死代码
- 代码可读性极差
- 不必要地实例化
integral_constant
需求与疑问
在以下约束条件下,是否存在更优实践?
- Base和Derived的类签名保持不变
- Derived::eval的函数签名保持不变
- Base类型引用可调用Derived的
eval<true>和eval<false>实例
内容的提问来源于stack exchange,提问作者user23311233
相关产品推荐
相关产品推荐

