仍然在我的封闭/开源混合中工作,早先在this question中谈过。有问题的应用程序实际上是一个类似应用程序的繁忙程序 - 有几个程序捆绑在一个程序中,实际的程序运行是根据输入的第一个命令选择的。这允许子程序共享CRT的一个副本(我不能使用可安装的redist,因为我需要维护单个二进制部署),以及在几个子程序中有用的几个内部。
由于某些子程序本身因许可限制而无法发布,我正在考虑使用这样的创业公司。 (抱歉代码量:()
ISubProgram.hpp
#include <string>
struct ISubProgram
{
virtual std::wstring GetExecutive() const = 0; //Return sub program name
virtual void OnStart(int argc, const char *argv[]) {};
virtual int Run(int argc, const char *argv[]) = 0;
virtual ~ISubProgram() {}
};
SubProgramList.hpp
#include <memory>
#include <boost/ptr_container/ptr_map.hpp>
#include <boost/noncopyable.hpp>
#include "ISubProgram.hpp"
class SubProgramList;
SubProgramList& GetSubProgramList();
class SubProgramList : boost::noncopyable
{
friend SubProgramList& GetSubProgramList();
SubProgramList() {} //Disallow direct creation.
boost::ptr_map<std::wstring,ISubProgram> programs;
public:
void RegisterProgram(std::auto_ptr<ISubProgram> subProgramToRegister);
ISubProgram * FindProgramFromExecutive(const std::wstring& executive);
void CallOnStartMethods(int argc, char *argv[]);
};
template <typename T>
struct RegisterSubProgram
{
RegisterSubProgram()
{
std::auto_ptr<ISubProgram> toAdd(new T);
GetSubProgramList().RegisterProgram(toAdd);
}
}
SubProgramList.cpp
SubProgramList& GetSubProgramList()
{
static SubProgramList theList;
return theList;
}
//Implementations of the class methods
ExampleSubProgram.cpp
#include "SubProgramList.hpp"
struct ExampleSubProgram : public ISubProgram
{
virtual std::wstring GetExecutive()
{
return L"ExampleSubProgram";
}
virtual int Run(int argc, const char *argv[])
{
//Run this program :)
}
};
namespace { RegisterSubProgram<ExampleSubProgram> registrar; }
Main.cpp的
#include "SubProgramList.hpp"
int main(int argc, char *argv[])
{
SubProgramList& list = GetSubProgramList();
list.CallOnStartMethods(argc, argv);
std::wstring subProgramName(/*.. Generate from argv[1] ...*/);
FindProgramFromExecutive(subProgramName)->Run(argc, argv);
}
我认为我没有初始化顺序问题,因为唯一的全局状态是本地静态而不是全局静态。
这样做的主要原因是我可以完全拆分程序的闭源和开源位,这样可以快速有效地进行合并,并且还可以删除当前“Giant if / else子程序选择器”的样板。在main
。
这是否合理地使用了开始初始化(通常不鼓励?)如果没有,你会建议什么替代实施?
答案 0 :(得分:2)
我可以提出一些带有递归模板实例化的聪明程序,但实际情况是你所做的是可能比我能想到的更简单。我认为全球国家是一个聪明的想法是很少见的,但在这一点上,我可能不得不接受我不能做得更好。