C++和STL:构造函数工厂

jww*_*jww 1 c++ factory functor

我有一个大工厂,我正在试图弄清楚如何让它看起来很漂亮.
大约有40种可能的对象/构造函数组合:

if(algorithm == "SHA-1")
    return new HashImpl<...>(algorithm, seed, size);
if(algorithm == "SHA-224")
    return new HashImpl<...>(algorithm, seed, size);
if(algorithm == "SHA-256")
    return new HashImpl<...>(algorithm, seed, size);
... 
if(algorithm == "AES" || algorithm == "AES128")
    return new BlockCipherImpl<...>(algorithm, seed, size);  
...
if(algorithm == "HmacSHA1")
    return new HmacImpl<...>(algorithm, seed, size);
...
Run Code Online (Sandbox Code Playgroud)

有没有办法将其放入地图中,这样我至少可以取消顺序搜索?我在弄清楚如何使构造函数成为一个仿函数时遇到了问题.

编辑:代码可以在这里找到:
http://code.google.com/p/owasp-esapi-cplusplus/source/browse/trunk/src/crypto/SecureRandomImpl.cpp,从第130行开始.

n. *_* m. 5

不需要使用它们花哨的新奇地图.

template <class Impl>
BaseImplementation* makeAlgo (const std::string& algo, 
                                const byte* seed, size_t size)
{
    return new Impl(algo, seed, size);
}

typedef BaseImplementation* makeAlgo_t (const std::string& algo, 
                                          const byte* seed, size_t size);

typedef struct { std::string name; makeAlgo_t func; } NamedAlgoMaker_t;


NamedAlgoMaker_t factory[] = {
  { "SHA-1",     makeAlgo< HashImpl <...> >  },
  ...
  { "HmacSHA1",  makeAlgo< HmacImpl <...> > },
  ...
};
Run Code Online (Sandbox Code Playgroud)

如果对数组进行排序,则可以使用二进制搜索快速查找算法.

当然,如果你愿意,也可以用这些东西构建一个地图(或散列/无序地图).