我正在一个相当复杂的项目,一个自定义的加密程序,如果你将(只是为了乐趣)和我遇到这个问题在我的代码设计的布局。

我有一些职能,我希望可以呼吁通过索引。具体地说,我需要能够调用的一个随机的加密过程,但后来解决这一特定指数在解进程。

我正在考虑一个典型功能阵列,但是我主要关注的是,这一功能的数组将难以维持,并且有点丑陋的。(我们的目标是让每个功能对在一个单独的文件,降低汇编时间和作出的代码的更容易管理。) 没有人有更典雅的用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 作为函数名称。

其他提示

函数数组有什么问题?

您需要通过索引调用函数。因此,必须将它们放入某些“索引可索引”状态。结构以某种方式。数组可能是最适合这种需求的结构。

示例(输入我的头,可能无法编译):

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

什么是“丑陋的”或“难以维持”或在上面的方法?

定义了operator()方法的对象可以像函数一样运行,但通常可以更好地工作。

多态性能做到的把戏:你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 };
  • 功能宣言和定义是在单独的文件编制时间确定。
  • 功能分组在一个单独的文件,具有依赖性的声明的只有

您可以查看 Boost.Signals库。我相信它能够使用索引调用其注册函数。

尝试Loki :: Functor类。更多信息,请访问 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