문제
나는 작업에 상당히 복잡한 프로젝트,사용자 정의 암호화가 일상적인 경우(다만 재미를 위해)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