题
我正在一个相当复杂的项目,一个自定义的加密程序,如果你将(只是为了乐趣)和我遇到这个问题在我的代码设计的布局。
我有一些职能,我希望可以呼吁通过索引。具体地说,我需要能够调用的一个随机的加密过程,但后来解决这一特定指数在解进程。
我正在考虑一个典型功能阵列,但是我主要关注的是,这一功能的数组将难以维持,并且有点丑陋的。(我们的目标是让每个功能对在一个单独的文件,降低汇编时间和作出的代码的更容易管理。) 没有人有更典雅的用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