使用模板进行 C++ 函数代码泛化

c++ function code generalization using template

本文关键字:C++ 函数 代码 泛化      更新时间:2023-10-16

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

不幸的是,您需要分别定义这两种方法,因为正如您所指出的,它们的签名因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"
    }
};

有关更多选项,请参阅此处。