I have not tested this yet, getting late in Austin, but would something like this work instead:

template <typename T, int N>
struct KernelArgumentHandler<T[N]>
{
static ::size_t size(const T value[N]) { return sizeof(T[N]); }
static T* ptr(T value[N]) { return &value; }
};

Note that the references have to be removed as C++ does not allow arrays to be passed by reference but this should not be an issue.

You can now do:

cl_int2 v = {0,1};
setArg(n, v);