Частичная специализация существующей мета-функции с использованием mpl

Может быть, я не все там сегодня, но мне интересно, как заставить это работать. Я хотел бы частично специализировать range_mutable_iterator и range_const_iterator из библиотеки boost, но только для конкретных типов, которые я бы предпочел не упоминать явно, вместо этого позволяя выбирать только частичную специализацию, если пройдены критерии теста enable_if.

В настоящее время я использую MSVC 2008 и получаю следующую ошибку:
ArrayType: template parameter not used or deducible in partial specialization по типу

range_mutable_iterator<
  typename enable_if<
    mpl::and_<
      mpl::has_key<some_type_map, typename remove_const<T>::type>,
      mpl::not_<is_const<T> >
    >,
    ArrayType
  >::type
>

Используя STLFilt, обратите внимание на странную ссылку на T вместо ArrayType, я предполагаю, что STLFilt говорит, что не может понять, что T == ArrayType..? Вот что у меня сейчас:

namespace boost {
template<class ArrayType>
struct range_mutable_iterator<
  typename enable_if<
    mpl::and_<
      mpl::has_key<some_type_map, typename remove_const<ArrayType>::type>,
      mpl::not_<is_const<ArrayType> >
    >,/*and_*/
    ArrayType
  >::type/*enable_if*/
>
{
  typedef MyArrayIterator<
    typename mpl::at<some_other_type_map,
      typename mpl::at<yet_another_type_map,ArrayType>::type
    >::type/*at*/
  >/*MyArrayIterator*/ type;
};
}

Получение работы range_begin/range_end в настоящее время не является проблемой, цель состоит в том, чтобы иметь линейную работу, которая выглядит следующим образом:

ThirdPartyArrayClass blah;
MyArrayAdapter<ThirdPartyArrayClass>::iterator iter = boost::begin(blah);

Изменить: После того, как попробовал другой подход, который я отредактировал из этого ответа, я пришел к выводу, что частичная специализация в этом случае просто невозможна, поэтому я использовал другой подход, который предполагает полную специализацию и интенсивное использование Boost.Preprocessor.

1 ответ

Решение

Чтобы частично специализировать шаблон, компилятор должен сопоставить фактические аргументы шаблона с существующими специализациями с целью выбора наилучшего соответствия. Это просто невозможно, если аргумент шаблона в специализации используется как параметр (шаблона) для зависимого типа. Итак, компилятор жалуется, и это правильно. Единственное, что вы можете сделать, это как-то специализироваться на вашем конкретном ThirdPartyArrayClass тип.

Другие вопросы по тегам