使用mpl的现有元函数的部分特化

时间:2010-08-03 19:55:08

标签: c++ boost metaprogramming partial-specialization

也许我今天不在那里,但我想知道如何让它发挥作用。 我想部分地从boost库中专门定位range_mutable_iterator和range_const_iterator,但仅针对特定类型,我宁愿避免明确提及,而只是在enable_if测试条件通过时才选择部分特化。

我目前正在使用MSVC 2008并收到以下错误:
类型

上的ArrayTypetemplate 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 :(得分:0)

为了部分特化模板,编译器必须匹配现有特化的实际模板参数,目的是选择最佳匹配。如果专门化中的模板参数仅用作依赖类型的(模板)参数,则这是不可能的。所以,编译器抱怨,这是正确的。你唯一能做的就是以某种方式专注于具体的ThirdPartyArrayClass类型。