К сожалению, C ++ в настоящее время не позволяет вам кратко кодифицировать такую информацию.
C ++ 11 должен был решить эту проблему с помощью концепций , но они были выброшены перед выпуском из-за некоторых концептуальных (хе) недостатков (, которые в пока что решено , насколько я знаю).
Но вы все равно можете предоставить такие понятия, используя статические утверждения и черты типа. Например, C ++ 11 позволяет написать следующий код:
template <class InputIterator>
void Object::add(InputIterator first, InputIterator last) {
static_assert(
std::is_same<
typename std::remove_cv<
typename std::iterator_traits<InputIterator>::value_type
>::type,
std::string>::value,
"InputIterator must be of iterator type");
…
}
Тем не менее, предполагается, что InputIterator
является допустимым типом итератора. Поскольку нет признака is_iterator
и никакого осмысленного способа реализовать это (насколько я знаю), за исключением проверки того, что выполняются все необходимые операции входного итератора , это делает его гораздо более сложным, чем он. теоретически может быть.