C ++引用告诉我们一个std :: map
typedef pair<const Key, T> value_type;
是否可以强制Key Type不是const? 我需要在模板方法中执行此操作,如
template<class T> // T represent a map in general (std::map, boost::unordered_map or whatever..)
void foo(const T& m)
{
typename T::value_type::first_type x;
x=0; // Wrong because x is const ...
}
答案 0 :(得分:15)
不,不是。
这是因为map基于key执行其内部排序。如果你可以自己修改钥匙,不管怎么说,一切都会破坏。
您应该使用提供的API函数;如果使用一个导致更改Key值(实际上我认为没有做任何事情),可能会进行适当的内部重新排序。
考虑getter和setter,以及它们在提供凌乱/危险的直接成员访问的替代方案中的用途。
但是,你可以这样写:
template<class T>
void foo(const T& m)
{
typename T::key_type x;
x = 0;
}
std::map
类型别名key_type Key
mapped_type T
value_type pair<const Key,T>
key_compare Compare
value_compare Nested class to compare elements
allocator_type Allocator
reference Allocator::reference
const_reference Allocator::const_reference
iterator Bidirectional iterator
const_iterator Constant bidirectional iterator
size_type Unsigned integral type (usually same as size_t)
difference_type Signed integral type (usually same as ptrdiff_t)
pointer Allocator::pointer
const_pointer Allocator::const_pointer
reverse_iterator reverse_iterator<iterator>
const_reverse_iterator reverse_iterator<const_iterator>
答案 1 :(得分:5)
typename T::key_type
会在不添加const
限定符的情况下为您提供密钥类型。
答案 2 :(得分:4)
以前的答案应该足以满足您的简单问题。作为一种更通用的方法,您可以使用boost::remove_const(来自boost type_traits)将const限定符移除到类型。
template<class T> // T represent a map in general (std::map, boost::unordered_map or whatever..)
void foo(const T& m)
{
typedef typename T::value_type::first_type X; //is const
typedef typename boost::remove_const<X>::type NonConstX;
NonConstX x;
x=0;
}
答案 3 :(得分:0)
密钥类型必须是const。如果您确定不会更改地图的顺序,则可以抛弃迭代器的常量。如果你错了,这可能导致丑陋的错误。