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

时间:2011-08-24 05:39:03

标签: 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);
...

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

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

3 个答案:

答案 0 :(得分: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 <...> > },
  ...
};

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

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

答案 1 :(得分:1)

你可以使用lambda函数的地图

答案 2 :(得分:0)

所以它仍然在视觉上难看。但是你可以通过以下方式加快速度:

  1. 创建~40个工厂方法,每个方法都返回其中一个选项。
  2. 创建一个地图,其中fnPointerTypedef是工厂方法的返回类型。
  3. 查找字典,并返回您查找的任何函数的结果。
  4. 创建一个枚举,为每个选项提供一个数字(例如SHA-1 = 0,SHA-224 = 1等)。
  5. 创建一个将字符串名称映射到{int | enum}的地图。
  6. 创建一个函数指针数组,让数组中的每个点指向正确的相应工厂方法。
  7. 查找字典并返回functionArray [enumInt];
  8. (编辑:感谢n.m.更直接的实施)