有没有办法从std::map<K,V>
例如:
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大不相同,因为我没有尝试声明任何变量,并且类型已知。
答案 0 :(得分:6)
您可以使用decltype
(wandbox 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>
}