将工厂方法扩展到模板化类



因此,我想将工厂方法扩展为具有注册表的模板化类。

我有下面的代码。它使用g++编译,但不注册模板化类

#include <iostream>
#include <memory>
#include <string>
#include <map>
template<class T>
class car
{
public:
car(){}
virtual ~car(){}
virtual void foo() = 0;
T var;
};
template<class T>
class Factory
{
public:
typedef car<T>* (*createObj)(void);
static bool checkIn(const std::string& name, createObj funcCreate)
{
if(storage.find(name) == storage.end())
{ 
storage[name] = funcCreate;
return true;
}
return false;
}
static car<T>* create(const std::string& name)
{
auto it = storage.find(name);
if (it != storage.end())
{
return it->second(); 
}            
return nullptr;
}
private:
static std::map<std::string, createObj> storage;
};
template<class T>
std::map<std::string, typename Factory<T>::createObj> Factory<T>::storage;

template<class T>
class car1
:public car<T>
{
public:
car1(){}
static car<T>* create()
{ 
return new car1;
}

static std::string name() { return "car1"; }
virtual void foo(){std::cout << "I am car1 " << std::endl;}
private:
static bool checkedIn;
};
template<class T>
bool car1<T>::checkedIn = Factory<T>::checkIn(car1::name(), car1::create);

int main()
{
car<double>* obj1 = Factory<double>::create("car1");
obj1->foo();
delete obj1;
obj1=nullptr;
return 0;
}

需要什么来使它注册?预计最终结果将类似于main函数中报告的内容。工厂方法适合模板化类吗?

亲切的问候

要使obj1不变为nullptr,必须将checkIn("car1", something)变为Factory<double>

正如您所评论的(请将该澄清编辑到您的问题文本中),您期望car1<double>::checkedIn做到这一点。不幸的是,c++标准中是这样写的:

除非类模板或成员模板的成员已被显式实例化或显式特化,否则当在需要成员定义存在的上下文中引用该特化时,成员的特化将被隐式实例化;特别是,除非静态数据成员本身的使用方式要求存在静态数据成员的定义,否则不会发生静态数据成员的初始化(以及任何相关的副作用)。

由于car1<double>::checkedIn从未以要求其存在的方式使用,因此编译器不允许用您想要的副作用初始化它。

因此,由于初始化的副作用可能永远不会发生,因此没有任何检入,并且您可以按照要求从Factory<double>::create()获得nullptr

除此之外,为什么你的代码以如此复杂的方式完成它的工作对我来说是相当神秘的,所以我只能描述它的行为就像已经写好了。

最新更新