Как выбрать правильную перегрузку шаблона функции?C++

Программы на C++. Форум разработчиков
Anonymous
Как выбрать правильную перегрузку шаблона функции?

Сообщение Anonymous »

Я использую libcxx 16.0.0 из проекта LLVM.
В __algorithm/fill_n.h есть следующая функция:

Код: Выделить всё

// fill_n isn't specialized for std::memset, because the compiler already optimizes the loop to a call to std::memset.

template 
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
_OutputIterator
__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
{
for (; __n > 0; ++__first, (void) --__n)
*__first = __value;
return __first;
}
Проблема в том, что в моем случае функция не оптимизирована под std::memset. Поэтому я хотел бы сделать эту специализацию вручную.
Я надеялся добавить перегрузку __fil_n для тривиально копируемых _Tp и смежных итераторов (включая std:: итератор массива).
Итак, учитывая следующий код,

Код: Выделить всё

template  struct foo_t {
struct iterator {};
};

template  int f(T) { return 1; }

template  int f(typename foo_t::iterator) { return 2; }

int main() {
foo_t::iterator a;

return f(a);
}
Как изменить сигнатуры f, чтобы вторая перегрузка выбиралась при вызове функции f в main?
Идеальным решением было бы решение с версией C++ >= 11, но

Подробнее здесь: https://stackoverflow.com/questions/787 ... n-template

Вернуться в «C++»