2011-08-24 3 views
1

저는 큰 공장을 가지고 있으며 어떻게 보이게 만드는지 알아 내려고하고 있습니다.C++ 및 STL : 생성자 팩터

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

그래서 적어도 멀리 순차 검색과 함께 할 수있는지도에이를 넣을 수있는 방법이 있나요 : 약 40 가능한 객체/생성자 조합
있다? 생성자를 함수 작성자로 만드는 방법을 알아내는 데 문제가 있습니다.

편집 : 코드는 여기에서 찾을 수 있습니다 :
http://code.google.com/p/owasp-esapi-cplusplus/source/browse/trunk/src/crypto/SecureRandomImpl.cpp는, 라인 (130)

+0

HashImpl의 <...>에 대한 자세한 내용을 알려주십시오. –

+0

코드에서 반환되는 내용에 차이가 나타나지 않습니다. 다른 '알고리즘'문자열에 대해 다른 점은 무엇입니까? 템플릿 인수? 생성자 인수? 어느 것 ? –

+0

로버트와 샌더 - 내 잘못입니다. 실제 코드에 대한 링크를 게시했습니다. 모두 'BaseImplementation *'을 반환합니다. – jww

답변

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

배열을 정렬 된 상태로 유지하면 이진 검색을 사용하여 알고리즘을 빠르게 찾을 수 있습니다.

원한다면 물론지도 (또는 해시/정렬되지 않은지도)를 만들 수도 있습니다.

+0

+1, 나는 이것의 단순함을 좋아한다. – molbdnilo

+0

@ n.m .: 내가 기대했던 것만 큼 귀찮지는 않지만, 못생긴 C++ 구문을 비난 할 수 있습니다. :) – jww

0

주위에 시작 그래서 그것은 여전히 ​​시각적으로 추한 될 것입니다. 그러나 다음과 같은 방법으로 더 빠르게 만들 수 있습니다.

  1. ~ 40 개의 팩토리 메소드를 생성합니다. 각각은 ~ 40 개의 선택 사항 중 하나를 반환합니다.
  2. 맵을 작성하십시오. 여기서 fnPointerTypedef는 팩토리 메소드의 리턴 유형입니다.
  3. 사전을 조회하고 조회 한 기능의 결과를 반환합니다.
  4. 각 옵션에 번호를 부여하는 열거 형을 만듭니다 (예 : SHA-1 = 0, SHA-224 = 1 등).
  5. 문자열 이름을 {int | enum}에 매핑하는 맵을 만듭니다.
  6. 함수 포인터의 배열을 만들고 배열의 각 지점을 올바른 해당 팩토리 메서드로 가리 키십시오.
  7. 사전을 조회하고 return functionArray [enumInt];

(편집 : 더 직접적인 구현을위한 감사 n.m.)

+0

이런 식으로해야한다면 Vim 매크로 나 비슷한 것을 할 수있을 것입니다. –

+2

문자열에서 int로 매핑 한 다음 int에서 함수 포인터로 매핑 할 필요가 없습니다. 문자열에서 함수 포인터로의 직접 매핑이 가능합니다. –