我的遗留代码库中存在以下情况
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);
}