SFINAE是shared_ptrs与普通ptr的模板化函数

时间:2015-10-18 15:49:41

标签: c++ pointers shared-ptr sfinae

请参阅以下简短代码段:

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'的成员

我们将非常感谢您在确定当前问题方面的任何帮助。 如果有更清洁,更合适的方法,也会非常感谢这种方法的一个例子。

感谢您的关注和帮助。

0 个答案:

没有答案