对于“busybox”样式应用程序,这种全局静态初始化的使用是否正常?

时间:2010-12-09 23:23:14

标签: c++ initialization

仍然在我的封闭/开源混合中工作,早先在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

这是否合理地使用了开始初始化(通常不鼓励?)如果没有,你会建议什么替代实施?

1 个答案:

答案 0 :(得分:2)

我可以提出一些带有递归模板实例化的聪明程序,但实际情况是你所做的是可能比我能想到的更简单。我认为全球国家是一个聪明的想法是很少见的,但在这一点上,我可能不得不接受我不能做得更好。