我在一些模板代码中遇到了烦人的const-correctness问题,最终归结为以下观察结果:出于某种原因,对于类STL容器T,
下面的示例说明了这个问题。假设您有一个模板函数,它接受一个容器,该容器必须满足STL随机访问容器概念要求。
然后,如果我们给这个函数传递一个const容器...
我们将
请注意,如果我将
那么,如何从容器T获取通用的、const-correct指针类型呢?(我真的看不出来除了使用boost::mpl::if_以及type_traits来检查容器是否是常量之外还有什么更简洁的方法)
编辑:如果有影响的话,我正在使用gcc 4.3.2进行编译。
const typename T::pointer
似乎并不产生常量指针类型,即使T::pointer
等同于T::value_type*
。下面的示例说明了这个问题。假设您有一个模板函数,它接受一个容器,该容器必须满足STL随机访问容器概念要求。
template <class Container>
void example(Container& c)
{
const typename Container::pointer p1 = &c[0]; // Error if c is const
const typename Container::value_type* p2 = &c[0];
}
然后,如果我们给这个函数传递一个const容器...
const std::vector<int> vec(10);
example(vec);
我们将
const int*
转换为int*
时出现了无效转换。但是,为什么在这个例子中const typename Container::pointer
不同于const int*
?请注意,如果我将
const typename Container::pointer
更改为简单的typename Container::const_pointer
,它可以编译通过。然而,据我所知,const_pointer typedef是一个扩展(我没有在C++标准容器要求(23.5,表65)中看到它被提及),因此我不想使用它。那么,如何从容器T获取通用的、const-correct指针类型呢?(我真的看不出来除了使用boost::mpl::if_以及type_traits来检查容器是否是常量之外还有什么更简洁的方法)
编辑:如果有影响的话,我正在使用gcc 4.3.2进行编译。
std::remove_pointer
这样的东西。第三,如果您可以直接访问指针类型,则不需要使用std::remove_pointer
。 - AnT stands with Russiastd::remove_ptr
在2009年的C++中很容易实现,并且已经在boost中使用了很长时间。顺便说一句,这不是责备游戏,而是为其他用户提供服务。 - darune