문제

나는 작업에 상당히 복잡한 프로젝트,사용자 정의 암호화가 일상적인 경우(다만 재미를 위해)and I've 실행으로 이 문제는 디자인에 나의 코드 레이아웃이 있습니다.

나의 번호를 가지 기능이 내가 원하는 수출로 인덱스입니다.특히,나는 할 수 있어야 중 하나를 호출을 위해 무작위로 암호화 프로세스,그러나 다음 주소에 의 특정 지수에는 복호화 과정입니다.

었을 고려하고 클래식 기능을 배열을,하지만 나의 주요 관심사는 함수 배열 될 것이 까다로운 유지하고,조금 못생긴입니다.(의 목표는 각 기능을 한 쌍에서 별도의 파일을 컴파일 시간 감소고 코드를 쉽게 관리할 수 있습니다.) 누군가가 더 우아한 C++솔루션으로 대체하는 기능을 배열?속도 정말 문제가 되지 않습니다,나는 더 걱정이 관리할 수 있습니다.

-Nicholas

도움이 되었습니까?

해결책

같은 것을 작성할 수 있습니다:

class EncryptionFunction
{
public:
    virtual Foo Run(Bar input) = 0;
    virtual ~MyFunction() {}
};

class SomeSpecificEncryptionFunction : public EncryptionFunction
{
    // override the Run function
};

// ...

std::vector<EncryptionFunction*> functions;

// ...

functions[2]->Run(data);

당신이 사용할 수 operator()Run 로서 함수 이름을,당신이 선호하는 경우.

다른 팁

무엇이 잘못된 기능으로 배열?

당신이해야 함수를 호출하여 인덱스입니다.그래서 그들은 해야 합니다에 넣어 일부는"색인에 의해 색인"구조 어떻게 든.배열은 아마도 가장 간단한 구조를 맞이 필요합니다.

예(입력을 밖으로 내 머리,컴파일되지 않을 수 있습니다):

struct FunctionPair {
   EncodeFunction encode;
   DecodeFunction decode;
};
FunctionPair g_Functions[] = {
   { MyEncode1, MyDecode1 },
   { MySuperEncode, MySuperDecode },
   { MyTurboEncode, MyTurboDecode },
};

무슨은"ugly"또는"을 유지하기 위해 열심히"에 접근하십니까?

체와 운영자()메소드를 정의할 수 있지만 비슷한 역할을 하는 기능이 있지만 일반적으로 더 좋은 작동합니다.

다형성을 할 수 있는 방법:당신 couldf 전략에 따라 패턴을 고려하여,각 전략을 구현하는 하나의 함수(또는 그들의 쌍).

다음 벡터를 만들의 전략을 수립하고,사용이 아닌 하나의 기능 목록입니다.

그러나 솔직히,나는 보지 않는 문제가 array;당신은 쉽게 만들 수 있습니다 typedef 을 쉽게 읽기 쉽도록 합니다.Effectifely,당신은 끝날 것이 정확히 같은 파일 구조를 사용하는 경우 전략 패턴이다.

// functiontype.h
typedef bool (*forwardfunction)( double*, double* );

// f1.h
#include "functiontype.h"
bool f1( double*, double* );

// f1.c
#include "functiontype.h"
#include "f1.h"
bool f1( double* p1, double* p2 ) { return false; }


// functioncontainer.c    
#include "functiontype.h"
#include "f1.h"
#include "f2.h"
#include "f3.h"

forwardfunction my_functions[] = { f1, f2, f3 };
  • 함수의 선언과 정의는 별도의 파일을 컴파일 시간은 좋습니다.
  • 기능 그룹에서는 별도의 파일을 가지고,종속성을 선언만

할 수 있는 살펴보 습니다.호 라이브러리.나는 그것을 믿는 능력을 호출하는 등록된 기능을 사용하여 인덱스입니다.

도 로키::함수 클래스입니다.더 많은 정보에 CodeProject.com

을 사용할 필요가 배열의 함수 포인터입니다.의 모든 기능을 기본적으로 동일한 시제품,의 이름만 기능과 전달되는 인수 이름이 달라질 수 있습니다.익 유형과 인수 유형(뿐만 아니라 인수의 수와 주문)동일해야 합니다.

int Proto1( void );
int Proto2( void );
int Proto3( void );

int (*functinPointer[3])( void ) =
{
   Proto1,
   Proto2,
   Proto3
};

당신은 다음과 같이 할 수 있다:

int iFuncIdx = 0;
int iRetCode = functinPointer[iFuncIdx++]();

면에서 보았 boost::signals 라이브러리,당신은 예를 참조하십시오,아주 좋은 것은 매우 우아:
이 있다고 가정 4 과 같은 기능:

void print_sum(float x, float y)
{
  std::cout << "The sum is " << x+y << std::endl;
}

void print_product(float x, float y)
{
  std::cout << "The product is " << x*y << std::endl;
}

void print_difference(float x, float y)
{
  std::cout << "The difference is " << x-y << std::endl;
}

void print_quotient(float x, float y)
{
  std::cout << "The quotient is " << x/y << std::endl;
}

다음을 호출하려는 경우에는 우아한 방법으로도:

boost::signal<void (float, float)> sig;

sig.connect(&print_sum);
sig.connect(&print_product);
sig.connect(&print_difference);
sig.connect(&print_quotient);

sig(5, 3);

고 출력은 다음과 같습니다.

The sum is 8
The product is 15
The difference is 2
The quotient is 1.66667
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top