使用模板的c ++函数代码泛化

时间:2012-04-25 01:02:21

标签: c++ templates iterator metaprogramming containers

我正在编写一个类似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>();

我的第一个问题是,什么类型名称实际上是ConstIterator begin() const

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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"
    }
};

有关更多选项,请参阅here