Следующий этот вопрос
Я получил шаблон функции
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)
Любая идея о том, как добиться этой проверки типов?
Вопрос немного расплывчатый и имеет несколько проблем. Но я думаю, что понял суть этого. static_assert
ты ищешь наверное;
static_assert(std::is_base_of<A,
typename std::iterator_traits<IT1>::value_type>::value,
"wrong type");
Вы пропустили несколько скобок и value
и т. д. Я отформатировал его так же, как ваш оригинальный пост.