我正在训练,我想实现一个工厂函数——一个接受任意数量参数(可变性)的模板。算法:模板接受类型——创建的类的类型,以及参数包的类型。在参数中,参数包本身。生成的类在继承链中。编码:
#include <memory>
class Base
{
public:
virtual void run() = 0;
};
class A : public Base
{
public:
A(int& a, int& b) {}
void run() override {}
};
class B : public Base
{
public:
B(int& a) {}
void run() override {}
};
enum class ClassConst : int
{
_A = 0,
_B
};
template<ClassConst mt, class... Args>
auto creator(Args&&... args)
{
std::unique_ptr<Base> result(nullptr);
if(ClassConst::_A == mt)
result = std::make_unique<A>(args...);
else if(ClassConst::_B == mt)
result = std::make_unique<B>(args...);
return result;
};
int main()
{
creator<ClassConst::_A>(45, 88);
creator<ClassConst::_B>(69);
}
代码无法编译:
- 未找到具有两个 int 参数的构造函数 B
- 移动构造函数 A 无法将 1 个 int 参数转换为 const A&
我想了解为什么会这样。
这里的问题是,在实例化时
creator
,两个分支总是被实例化——if
其中else
一个将是无效的。要解决此问题,您应该使用if constexpr
如果计划重复这样的划分,那么从类标识符到类型的类型映射器会更方便:
转发参数通常也很有意义。