3

A と B の 2 つのクラスがあります。フィールドは配列とそのサイズだけです。すべてのメソッドは正確に同じであり、唯一の違いは、すべてのメソッドで取得されるインデックス整数の解釈にあります。テンプレート化して、1 つを std::plus で、もう 1 つを std::minus でインスタンス化できるようにします。

ちょっとしたコード:

class AB {
    int dim;
    int *tab;
    public:
    // obvious ctor & dtor
    void fun1( int a, int b );
    void fun2( int a, int b );
    void fun3( int a, int b );
}

void AB::fun1( int a, int b ) {
// operation of "interpretation" here i.e. addition or subtraction of ints into indexing int _num
// some operation on tab[_num]
}

どうやってやるの?

4

1 に答える 1

3

次のようになります。

template< typename Op >
void AB::fun1( int a, int b )
{
    Op op;

    tab[ op( a, b ) ];
};

次のようにインスタンス化されます。

AB ab;
ab.fun1< std::plus< int > >( 1, 2 );
ab.fun1< std::minus< int > >( 1, 2 );

これがすべてのメソッドで発生する場合は、AB代わりにテンプレート化する方が理にかなっている可能性があります。

template< typename Op >
class AB
{
    ... use as above ...
};

これは、操作がステートレスであることを前提としているため、そのようなタイプのデフォルトの構築済みオブジェクトを作成することは、他のインスタンスと同等です。この仮定の下では、コードは次のように書くこともできますOp()( a, b )

于 2013-01-08T05:08:18.873 に答える