C ++ 11从变量中获取std :: map value_type

时间:2016-10-10 07:57:10

标签: c++ c++11 typetraits

有没有办法从std::map<K,V>

类型的变量中获取value_type

例如:

class Foo{
    private:
        std::map<int,double> myMap;
    public:
        void Bar(const std::map<int,double>& m)
        {
            using PairType = m::value_type; //How to enable something like this?
            std::vector<PairType> vec(m.size());
            read_ints_and_doubles(&vec, m.size()); //expects a void* (legacy lib I'm using)
        }
};

显然我知道我可以使用std::map<int,double>::value_type,但我希望这对未来的变化持开放态度。

我考虑过使用using MyMapType = std::map<int,double>,然后在任何地方使用MyMapType,但我不想这样做,而且在我看来,有一种方法可以从中获取此信息变量本身,因为这是所有静态信息,我不知道为什么我无法访问此信息。

修改 这个问题与建议的dup Declare variables that depend on unknown type in template functions大不相同,因为我没有尝试声明任何变量,并且类型已知。

2 个答案:

答案 0 :(得分:6)

您可以使用decltypewandbox example):

using PairType = decltype(m)::value_type;

在上面的代码段中,decltype(m)评估为m的类型。

在您的特定情况下,您可能希望使用std::remove_reference_t从评估类型中删除引用 - decltype不会自动“衰减”评估类型。

  • C ++ 14示例:

    using PairType = decltype(m)::value_type;
    std::vector<std::remove_reference_t<PairType>> vec(m.size());
    
  • C ++ 11示例(on wandbox):

    using PairType = decltype(m)::value_type;
    using RemoveRefPairType = typename std::remove_reference<PairType>::type;
    std::vector<RemoveRefPairType> vec(m.size());
    

答案 1 :(得分:2)

decltype会帮助你,例如:

int main()
{
    std::map<int, int> m;
    using mytype = decltype(m)::value_type;
    mytype r = {1, 5}; // std::pair<const int, int>
}