Представьте, что у меня есть шаблонная функция, подобная этой:
template<typename Iterator>
void myfunc(Iterator a, typename Iterator::value_type b)
{ ... }
Есть ли способ реализовать то же самое, объявив typedef для Iterator :: valuetype, который я могу использовать в сигнатуре функции?Например, я предпочел бы иметь возможность делать что-то вроде этого:
template<
typename Iterator,
typedef Iterator::value_type type>
void myfunc(Iterator a, type b)
{ ... }
До сих пор я прибегал к использованию аргументов шаблона по умолчанию и проверке концепции Boost, чтобы гарантировать, что по умолчанию всегда используется:
template<
typename Iterator,
typename type = typename Iterator::value_type >
void myfunc(Iterator a, type b)
{
BOOST_STATIC_ASSERT((
boost::is_same<
typename Iterator::value_type,
type
>::value
));
...
}
... но было бы неплохо, если бы в языке существовала поддержка для такого типа вещей.
Edit
Я, вероятно,должен был использовать класс вместо функции, так как аргументы по умолчанию не являются стандартными для функций.
template<
typename T,
typename V = typename T::value_type>
class A : public B<T, V>
{
BOOST_STATIC_ASSERT((boost::is_same<typename T::value_Type, V>::type));
};