次の(疑似)コードが与えられた場合:
typedef std::map<const unsigned int, unsigned long int> ModelVector;
typedef std::vector<unsigned long int> EncryptedVector;
int test1 (const EncryptedVector &x)
{
//compute ModelVector y
data = kenel1(x, y);
//compute output
}
int test2 (const EncryptedVector &xx)
{
//compute ModelVector y
data = kenel2(xx, y);
//compute output
}
int test3 (const EncryptedVector &x, const EncryptedVector &xx)
{
//compute ModelVector y
data = kenel3(x, xx, y);
//compute output
}
int test4 (const EncryptedVector &x, const EncryptedVector &xSquared)
{
//compute ModelVector y
data = kenel4(x, xSquared, y);
//compute output
}
変数 y と output は 4 つの関数すべてで同じように計算され、switch ステートメントを介して適切なカーネル関数を選択できる「グローバル」オブジェクトがあるため、それらを記述するよりエレガントな方法があるかどうか疑問に思っていました。できればどういうわけかそれらをマージします...
たとえば、次のようなもの (疑似コード) が適しています。
int test (const EncryptedVector &x, const EncryptedVector &xx, const EncryptedVector &xSquared)
{
//compute ModelVector y
//switch (kernel) -> select the appropriate one
//compute output
}
test (x, NULL, NULL);//test1
test (NULL, xx, NULL);//test2
test (x, xx, NULL);//test3
test (x, NULL, xSquared);//test4
または、さらに良いことに、さまざまなパラメーターの組み合わせで test を複数回宣言し、すべて上記のものにフォールバックすることもできます (x と xx のセマンティックな区別は失われますが)。
上記のアプローチの問題は、C++ では std::vector の代わりに NULL を渡すことが許可されていないことです。変数を参照渡しする代わりにポインターで渡し始めるよりも、コードを 4 回繰り返す方がよいと思います。 ..
これを行う他の方法はありますか?
編集: カーネル関数のプロトタイプは次のとおりです。
int kernel1 (const EncryptedVector &x, const ModelVector &y);
int kernel2 (const EncryptedVector &xx, const ModelVector &y);
int kernel3 (const EncryptedVector &x, const EncryptedVector &xx, const ModelVector &y);
int kernel4 (const EncryptedVector &x, const EncryptedVector &xSquared, const ModelVector &y);