Частичная специализация существующей мета-функции с использованием 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
тип.