请参阅以下简短代码段:
template<typename M, typename V>
void MapToVector(const M &map, V &vec) {
for (const auto &mapElem : map) {
vec.push_back(mapElem.second.get());
}
}
在上面的代码中,我将shared_ptrs的std :: map转换为某个对象,并将它们插入到同一类型的原始指针向量中。
我的目标是SFINAE这个功能,以便它可以选择上面的功能或以下功能。
template<typename M, typename V>
void MapToVector(const M &map, V &vec) {
for (const auto &mapElem : map) {
vec.push_back(mapElem.second);
}
}
我只阅读了enable_if和另一篇关于成员检测的文章: https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector
然而,由于成员检测器示例实例化了不能用作模板参数的真实对象(或许它可以但我不知道如何),因此无法混合2篇文章。
请参阅以下尝试同时使用enable_if和成员检测器:
template<typename M, typename V,
typename std::enable_if<typename HasMember_get<typename V::value_type>::value>::type
>
void MapToVector(const M &map, V &vec) {
for (const auto &mapElem : map) {
vec.push_back(mapElem.second.get());
}
}
template<typename M, typename V>
void MapToVector(const M &map, V &vec) {
for (const auto &mapElem : map) {
vec.push_back(mapElem.second);
}
}
请注意,在我的SFINAE尝试中,我有另外一个问题,即推断存储在矢量中的类型:
template<typename M, typename V,
typename std::enable_if<typename HasMember_get<typename V::value_type>::value>::type
>
我认为V :: value_type还存在非推断上下文的问题,但我仍然不确定这是否真的是问题所在。 使用上面的代码片段,编译错误是:错误3错误C2039:'type':不是'std :: enable_if'的成员
我们将非常感谢您在确定当前问题方面的任何帮助。 如果有更清洁,更合适的方法,也会非常感谢这种方法的一个例子。
感谢您的关注和帮助。