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