質問

ように、かなり複雑なプロジェクトは、カスタム暗号化通常の場合(楽しい)と思いこの号の設計に自分のコードをレイアウト。

私は数々の機能がこういうことができるように呼び出します。具体的には、必要性を呼び出すことができるのは一つにランダムに暗号化処理がその後住所により特定のインデックスの復号です。

また、クラシック機能の配列が私の主な懸念があることで機能を配列するトリッキーを維持し、ちょっとした醜い.の目標は各機能のペアを別のファイルを減らすため、コンパイル時にコードが容易に管理いたします。) いてより優雅なC++解決の代替としての機能配列?速いなだけじゃない傷を付けても問題んまり気にな繋がります

-ニコラス

役に立ちましたか?

解決

き書きのようなもの:

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 として機能名ます。

他のヒント

何が悪いのかという機能の配列?

必要な関数の呼び出しインデックスコンサルティング.それなければいけあ"indexableインデックスコンサルティング"の構造 なんだか.配列に入れるのが最も簡単な構造に適しています。

例(タイピングのヘッドのいずれをコンパイル):

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

何が"醜い"または"hard"維持"のアプローチしますのでご注意ください。▼

オブジェクトとオペレーター()メソッドを定義できるよう機能が一般的にはお勧めするのに用いられております。

多型がん:まcouldfの戦略パターンを考慮し、それぞれの戦略のひとつを実施するための関数(またはペアました。

それをベクターの戦略は、この機能の一覧です。

でも正直に言うときというものはないと思い、問題の配列;で簡単に作成できます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 };
  • メソッドの宣言と定義して別のファイル-コンパイル時にはokです。
  • この機能分類は、別のファイル、依存関係の宣言のみ

などに連れて行くことができ、 が進みました。信号館.この呼び、その登録機能を使用。

試ロキ::元クラスです。詳細情報で 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