gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:46 26 4
gpt4 key购买 nike

我正在编写一个类似 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'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"
}
};

参见 here更多选项。

关于c++函数代码泛化使用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10308049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com