首页 > 解决方案 > 通过模板特化实现条件函数调用

问题描述

我正在尝试对遗留代码进行依赖注入,因为性能很重要,因此无法应用动态多态性。以下是我目前的想法,无法编译。

// myclass.h     
class MyClass {
    public:
        MyClass(GlobalsImpl *globals) { globalsImpl = globals; }
        MyClass(GlobalsTest *globals) { globalsTest = globals; }
        std::string test();
    
    private:
        template<bool> auto getGlobals();
    
    private:
    bool isImpl;
    GlobalsImpl *globalsImpl;
    GlobalsTest *globalsTest;
    };

// myclass.cc
    template<bool> auto MyClass::getGlobals() { return getGlobals<> }
    template<> Impl * MyClass::getGlobals<true>() { return globalsImpl; }
    template<> Test * MyClass::getGlobals<false>() { return globalsTest; }
    
    std::string MyClass::test() { return ""; }

我的直觉是实现 if test 调用,然后 return globalsTest; 否则返回 globalsImpl。globalsImpl 是真正的实现,而 globalsTest 是我的注入。我怎样才能做到这一点?

标签: c++templatesdependency-injection

解决方案


推荐阅读