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