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

Может быть, я не все там сегодня, но мне интересно, как заставить это работать. Я хотел бы частично специализировать 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 Ответ

0 голосов
/ 04 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...