确定模板参数

时间:2014-02-23 14:27:53

标签: c++ c++11

我的遗留代码库中存在以下情况

class Legacy
{
public:
    void LegacyFn(bool b)
    {
        if (b)
        {
            // some code
            Legacy l;
            l.LegacyFn(!b);
        }
        else
        {
            // some code
        }
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

我没有把Legacy变成模板类的奢侈品,也没有将LegacyFn作为模板函数或传递任何参数(包括默认值)的奢侈。

我的目标是改变LegacyFn函数以使用策略对象。因此,我提供了一个LegacyFn模板函数,该函数实例化相应的策略对象并在Legacy类中进行配置。但是我的问题在于在调用原始LegacyFn时确定由模板化LegacyFn配置的Strategy对象的实际具体类型

#include <memory>

// new implementation
class IStrategy
{
public:
    virtual void g() = 0;
};

// new implementation
class ConcreteStrategy : public IStrategy
{
public:
    void g() override
    {

    }
};

class Legacy
{
public:
    template<class T>
    void LegacyFn(bool b)
    {
        m_actionImpl.reset(new typename
            std::enable_if<std::is_base_of<IStrategy, T>::value,
            T>::type());
        return LegacyFn(b);
    }

    void LegacyFn(bool b)
    {
        if (b)
        {
            // some code
            Legacy l;
            l.LegacyFn<??>(false);        <--- **My problem is here**
                                                  <--- I want it to be ConcreteStrategy
                                                  <--- object, as the same class was
                                                  <--- used by the calling function template
                                                  <--- as the strategy object
        }
        else
        {
            m_actionImpl->g();
        }
    }

    std::unique_ptr<IStrategy> m_actionImpl;
};

int main(int argc, char* argv[])
{
    Legacy l;
    l.LegacyFn<ConcreteStrategy>(true);
}

0 个答案:

没有答案