2015-09-06 89 views
1

假设我有以下功能:声明取决于迭代的容器const或非const

template <typename Iterator> 
void f() 
{ 
    std::list<int> numList; 
    Iterator it = numList.begin(); 
    ... 
} 

Iterator可以是std::list<int>::iteratorstd::list<int>::const_iterator

上述函数编译为std::list<int>::iterator,但std::list<int>::const_iterator该列表应声明为const std::list<int>

是否有申报清单要么std::list<int>const std::list<int>取决于Iteratoriteratorconst_iterator类型的方法吗?

+6

为什么要将它声明为'const std :: list '?这是你的要求吗?因为你可以从一个非const列表中获得一个'const_iterator'。 – Jack

+0

好的。但是它们是通过不同的函数获得的:'begin()'和'cbegin()'。如何从非const列表中获取'iterator'或'const_iterator'? – Hrant

+0

'const_iterator'应该可以转换为'iterator',所以只需使用'cbegin'。 –

回答

3

应该使用std::iterator_traits<type_traits>std::conditional,类似于

using pointer_type = typename std::iterator_traits<Iterator>::pointer; 
using list_type = typename std::conditional<std::is_const<pointer_type>::value, const std::list<int>, std::list<int>>::type; 

list_type numList; 

记住,这是未经测试,所以你或许应该调整它一点点的东西是不可能的,它只是给你背后的基本理念。请检查this答案。

相关问题