如何避免调用C++模板类的模板方法时添加template前缀?
避免调用模板成员函数时重复写
template前缀的几种方法 在依赖上下文(比如模板函数里的Foo<B>& foo)中调用模板成员函数,C++标准要求必须加template前缀消除歧义,但可以通过以下方式简化调用:
1. 在类内添加非模板包装函数
直接在Foo类里封装常用的模板调用场景,提供非模板成员函数供外部调用:
template<bool X> class Foo { template<bool Y> void bar(); // 封装固定Y=true的调用 void bar_true() { bar<true>(); } // 或做通用非模板接口,根据参数调用对应模板 void bar(bool y) { if (y) bar<true>(); else bar<false>(); } }; // 调用时无需template前缀 template <bool B> void hi(Foo<B>& foo) { foo.bar_true(); // 或者传参数调用 foo.bar(true); }
2. 用lambda或局部封装简化重复调用
如果只是在某个函数内多次调用同一个模板实例,用lambda封装一次调用逻辑,后续直接调用lambda:
template <bool B> void hi(Foo<B>& foo) { // 只写一次template,后续直接用lambda auto bar_true = [&foo]() { foo.template bar<true>(); }; bar_true(); bar_true(); // 多次调用无需重复写template }
3. 将模板参数改为函数参数(语义允许时)
如果Y的取值不需要在编译期确定,把模板参数改成普通函数参数,让bar不再是模板函数:
template<bool X> class Foo { // 用普通参数替代模板参数,C++17+可用constexpr if做编译期分支 void bar(bool y) { if constexpr (y) { // Y=true时的编译期逻辑 } else { // Y=false时的编译期逻辑 } } }; // 调用时直接传参,完全不需要template template <bool B> void hi(Foo<B>& foo) { foo.bar(true); }
4. 全局辅助模板函数封装
写一个全局辅助函数,把template逻辑藏在里面,调用点只需传参数:
template<bool B, bool Y> void call_bar(Foo<B>& foo) { foo.template bar<Y>(); } template <bool B> void hi(Foo<B>& foo) { // 调用辅助函数即可,不用写template call_bar<B, true>(foo); }
内容的提问来源于stack exchange,提问作者Orbyfied
相关产品推荐
相关产品推荐

