C++ 和 STL : Constructor Factory

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

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

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

最佳答案

无需使用它们花哨的新奇 map 。

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 <...> > },
  ...
};

如果保持数组排序,则可以使用二分查找算法快速找到算法。

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

关于C++ 和 STL : Constructor Factory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170915/

相关文章:

c++ - 有没有办法在 C++ 中为 TAB 字符(反斜杠 t) "\t"设置特定数量的最大空格?

c++ - 如何让叮当警告非常简单的缩小

c++ - 如何正确复制给定其 shared_ptr 的对象

haskell - 为什么<*>中的函数为Nothing时Maybe的Applicative实例不给出任何内容

java - java中的泛型仿函数类

c++ - boost spirit 解析引用字符串失败

laravel-5 - 如何使用 $faker->word 获得独特的值(value)?

php - 如何在 ZF2 中的字段集工厂中使用集合

java - 如何在 TestNG 中生成不同名称的测试?

c++ - 将功能实现为仿函数的优点和缺点