1

我正在编写一个类似 stl 的容器类,它具有以下功能:

    Iterator begin(){
        return Iterator(data_.begin(), 1);
    }

    ConstIterator begin() const{
        return ConstIterator(data_.begin(), 1);
    }

我想我可以用一个函数来替换两者:

    template <typename itr0, typename itr1>
    itr0 begin(){
        return itr1(data_.begin(), 1);
    }

当我调用以下代码时,代码是在编译时生成的:

    Iterator it = foo.begin<Iterator, Iterator>();
    ConstIterator it = foo.begin<ConstIterator const?, ConstIterator>();

我的第一个问题是, typename 实际上是什么ConstIterator begin() const

其次,有没有办法让这个元编程在课堂之外是透明的?即我仍然可以使用以下代码来调用 begin() 就好像它是以标准方式编写的一样?

    C foo;
    const C foo2;
    Iterator it = foo.begin();
    ConstIterator it = foo2.begin();
4

1 回答 1

1

不幸的是,您需要分别定义这两种方法,因为正如您所指出的,它们的签名因const修饰符而异。没有可用的模板魔法可以克服这个问题(至少我知道没有)。

但是,您可以使用多种不同的技术将它们的实现组合成一个方法。这是一个这样的选项,可以避免任何const_cast'ing:

struct Container
{
    template< typename I, typename C >
    friend I begin_impl( C & c ){
      return I( c.data_.begin(), 1 );
    }

    Iterator begin(){
        return begin_impl< Iterator >( *this ); // *this is "Container"
    }

    ConstIterator begin() const{
        return begin_impl< ConstIterator >( *this ); // *this is "Container const"
    }
};

有关更多选项,请参见此处

于 2012-04-25T01:58:39.167 回答