1

配列が参照によって渡されるときに、テンプレート関数が定数配列のサイズを推測すると便利な場合があります。

template <unsigned N>
void foo (int (&arg) [N]);

int data [3];

foo (data); // deduces N=3

ここで、配列メンバーへのポインターでこの推論を実行したいと思います。これはあなたにアイデアを与えるはずです

struct X
{
    int inner_data_1 [3];
    int inner_data_2 [4];
};

template <typename T, unsigned N>
void bar (int T ::* (& arg1) [N], int (& arg2) [N])
{
    // In the example below:
    //    arg1 should be a pointer to X::inner_data_X
    //    arg2[i] should be the value of outer_data_X[i]
    // and ultimately I want a pointer to X::inner_data_X[i]
}

int main ()
{
    X x;

    int outer_data_1 [3];
    int outer_data_2 [4];

    bar (& X::inner_data_1, outer_data_1);
    bar (& X::inner_data_2, outer_data_2);

    // This should create a compile error because N is mismatched
    //bar (& X::inner_data_1, outer_data_2);
}

私はこれを正しく表現していません.barのarg1の型は「Tのメンバーへのポインターの配列[N]」だと思いますが、私が欲しいのは「配列のメンバーへのポインター[N]- of-T」

これはできますか?

できれば、arg1[N]有効ではないように思われるので、次のように書く必要があります

T * object;
auto ptr_to_ith_member = & ((object->*arg1)[i]);

これは、最終的に関連付けたいものですarg2[i]

4

2 に答える 2