Это немного сложно, но вы можете использовать рекурсию шаблона, чтобы помочь вам выполнить задание почти полностью во время компиляции. Я понимаю, что это не совсем то, что вы ищете, но я думаю, что это стоит: -)
Вот код:
#include <vector>
using namespace std;
typedef vector<vector<int> > vector2d;
template<size_t K, size_t M, size_t N>
struct v_copy {
static void copy(vector2d& v, int(&a)[M][N])
{
v[K - 1].assign(a[K - 1], a[K - 1] + N);
v_copy<K - 1, M, N>::copy(v, a);
}
};
template<size_t M, size_t N>
struct v_copy<1, M, N> {
static void copy(vector2d& v, int(&a)[M][N])
{
v[0].assign(a[0], a[0] + N);
}
};
template<size_t M, size_t N>
void copy_2d(vector2d& v, int(&a)[M][N])
{
v_copy<M, M, N>::copy(v, a);
}
int main()
{
int A[2][3] = {{0, 1, 2}, {10, 11, 12}};
vector2d vector(2);
copy_2d(vector, A);
}
ему нужна структура, потому что в C ++ вы не можете выполнять частичную специализацию функций. Кстати, компилируя его с gcc версии 4.5.0, этот код производит ту же сборку, что и
vector[1].assign(A[1], A[1] + 3);
vector[0].assign(A[0], A[0] + 3);
Не должно быть очень сложно заставить его компилироваться с различными типами двухмерных массивов.