Тип соответствия в шаблонах

Играя с шаблонами, я реализовал этот для итераций массивов:

template<class T, size_t size>
void iterate(T(&arr)[size], void(*fn)(T&)) {
for(size_t i=0; i<size; ++i) fn(arr[i]);
}

Так что я мог бы повторять массивы, как это

void printn(int& n) {
printf("%d\n",n);
}

int a[] = {3,-4,6,2};
iterate(a,printn);

Затем я понял, что мне также нужен константный итератор, поэтому первая плохая идея была в коде

template<class T, class U, size_t size>
void iterate(T(&arr)[size], void(*fn)(U&)) {
for(size_t i=0; i<size; ++i) fn(arr[i]);
}

Я знаю, что это плохо, но мне интересно, почему это поведение:

void printn(int& n); // works
void printn(const int& n); // also works
void printn(short& n); // type mismatch
void printn(const short& n); // works

Существует также проблема с лямбдами:

iterate(a,[](int& n) { printf("%d\n",n); }); // type mismatch

Так что вопрос Почему несоответствия типов и как их решить?

Я использую 32-битную MinGW 4.8.1 с -std=C++11 вариант.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]