Принудительно использовать параметры шаблонной функции для итераторов определенного типа.

Следующий этот вопрос

Я получил шаблон функции

template <typename T1, typename T2, typename IT1, typename IT2>
MethodResult<T1, T2>& method (IT1 it1begin, IT1 it1end, IT2 it2begin, IT2 it2end);

Со следующей схемой наследования

class A
class B : A
class C : A

Я хотел бы, чтобы функция для обеспечения соблюдения
IT1 а также IT2 быть итератором, разыменование которого T1 а также T2 соответственно.

Для этого я попытался

static_assert(std::is_base_of< A,
typename list<T1>::iterator::value_type >::value,
"wrong type");

Который прекрасно компилируется, однако ничего не навязывает, как при вызове

method<B, C>("not an", "iterator", 3, 2);

Компилятор не выдает ошибку.

Обратите внимание, что я попробовал первым

        static_assert(std::is_base_of<A,
typename std::iterator_traits<T1>::value_type,
"wrong type");

после того как я прочитал этот вопрос но компиляторы уступают.

wrong number of template arguments (3, should be 2)

Любая идея о том, как добиться этой проверки типов?

1

Решение

Вопрос немного расплывчатый и имеет несколько проблем. Но я думаю, что понял суть этого. static_assert ты ищешь наверное;

static_assert(std::is_base_of<A,
typename std::iterator_traits<IT1>::value_type>::value,
"wrong type");

Вы пропустили несколько скобок и value и т. д. Я отформатировал его так же, как ваш оригинальный пост.

4

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


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