8

インターフェイスがあると仮定します

class I{
public:
    virtual void f(int id)=0;
    virtual void g(int id, float x)=0;
}

ある種のIDからポインタへのマッピングを行うために、プロキシクラスが必要です

class Proxy : I
{
    I * i[5];
public:
    void f(int id)
    {
        i[id]->f(id);
    }

    void g(int id, float x)
    {
        i[id]->g(id, x);
    }

}

だから私が書くとき

Proxy *p;
p->f(1);

f は id=1 のオブジェクトで呼び出されます

そのようなケースがいくつかあり、インターフェースはかなり大きいです。したがって、すべての関数をプロキシ クラスにコーディングする必要はありません。自動的に行う方法はありますか?マクロ、テンプレート、「->」などのオーバーロードを使用している可能性があります。

4

3 に答える 3

7

簡単な解決策は、インターフェイスへのポインターを返す operator-> を定義することです。しかし、誰もがオブジェクトに直接アクセスでき、実際にはプロキシ クラスが必要ないため (std::map を使用することもできます)、カプセル化が壊れます。

別の方法として、次のようなことができます

template <typename Interface>
class Proxy
{
   Interface* interfaces[5];
public:
  template <typename F, typename... Params>
  auto operator()(F f, const int id,  Params... parameters)
           -> decltype((interfaces[id]->*f)(id, parameters...))
  { return (interfaces[id]->*f)(id, parameters...); }
};

C++11 の機能に大きく依存しているため、コンパイラでコンパイルできない可能性があります。

最初に Variadic テンプレートを使用します。詳細については、 https://en.wikipedia.org/wiki/Variadic_Templatesを参照してください。

次に decl_type を使用します。詳細については、 https://en.wikipedia.org/wiki/Decltypeを参照してください。

次のように使用する必要があります。

  Proxy<I> p;
  ...

  p(&I::f,1);
  p(&I::g,3, 1.);
于 2012-04-20T13:04:39.633 に答える
0

これがあなたに適しているかどうかはわかりませんが、関数へのポインターを使用してこれを処理できます...

すなわち。

#include <stdio.h>

typedef void (*f)(int);

void f1(int a)
{
    printf("f1: %d\n", a);
}
void f2(int a)
{
    printf("f2: %d\n", a);
}
int main(int argc, char *argv[])
{
    f array[5] = {NULL}; // create array of pointers
    array[0] = f1; // assign different functions on them
    array[1] = f2; // -||-

    array[0](10); // call them
    array[1](12);

    // and you end up with something like "array[i]();" in your proxy class...
}
于 2012-04-20T12:00:06.883 に答える