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]-的-T"

我可以这样做吗?

如果可以的话,它似乎arg1[N]是无效的,所以我不得不写一些类似的东西

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

这就是我最终想要关联arg2[i]的内容。

4

2 回答 2

0

如果您想要指向成员数组的指针,则语法为:

template <typename T, unsigned N>
void bar (int (T::*arg1) [N], int (& arg2) [N])
于 2013-08-12T22:03:01.723 回答
0

符号相当简单:

template <typename T, typename S, int Size>
void bar(T (S::*)[Size], T (&)[Size])
{
}

该函数推导出T数组元素的类型S、封闭类型以及Size指向成员数组的指针的类型。

于 2013-08-12T22:05:59.570 回答