C++ SFINAE共享ptr与普通ptr的模板函数

C++ SFINAE共享ptr与普通ptr的模板函数,c++,pointers,shared-ptr,sfinae,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()); } } 模板 void MapToVector(常量M&map、V&vec){ 用于(常量自动和映射:映射){ vec

请参阅以下简短片段:

template<typename M, typename V>
void MapToVector(const M &map, V &vec) {
    for (const auto &mapElem : map) {
        vec.push_back(mapElem.second.get());
    }
}
模板
void MapToVector(常量M&map、V&vec){
用于(常量自动和映射:映射){
vec.push_back(mapElem.second.get());
}
}
在上面的代码中,我将共享的ptr的std::map转换为某个对象,并将它们插入到同一类型的原始指针向量中

我的目标是定义此函数,以便它可以选择上面的函数或下面的函数

template<typename M, typename V>
void MapToVector(const M &map, V &vec) {
    for (const auto &mapElem : map) {
        vec.push_back(mapElem.second);
    }
}
模板
void MapToVector(常量M&map、V&vec){
用于(常量自动和映射:映射){
向量推回(马普兰秒);
}
}
我只阅读了enable_if和另一篇关于成员检测的文章:

但是,这两篇文章不能混用,因为给出的成员检测器示例实例化了不能用作模板参数的真实对象(或者可以,但我不知道如何使用)

请参阅我在一起使用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);
    }
}
模板
void MapToVector(常量M&map、V&vec){
用于(常量自动和映射:映射){
vec.push_back(mapElem.second.get());
}
}
模板
void MapToVector(常量M&map、V&vec){
用于(常量自动和映射:映射){
向量推回(马普兰秒);
}
}
请注意,在我的SFINAE尝试中,我遇到了另一个推断向量中存储的类型的问题:

template<typename M, typename V,
    typename std::enable_if<typename HasMember_get<typename V::value_type>::value>::type
    >
模板
我认为对于V::value_类型也存在一个非推断上下文的问题,但我仍然不确定这是否真的是问题所在。 对于上述代码段,编译错误为:错误3错误C2039:“类型”:不是“std::enable_if”的成员

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


谢谢您的关注和帮助。

不确定,但我倾向于通过get()上的decltype使用SFINAE——这是我要尝试的第一件事。如果您要将共享指针转换为弱指针,您无论如何都应该使用ctor,而不是使用
get()
中的原始指针,这使得整个问题变得毫无意义。我的错,我用弱ptr这个术语与原始指针并列使用。我将在我的帖子中对其进行编辑。重载基于值\u类型与共享\u ptr相等(通过将此类型检测为M的一部分)如何定义两个
make\u raw
重载,一个获取共享指针并返回
.get()
的结果,一个获取原始指针并返回参数,并从单个函数模板调用它
MapToVector()
?另外,考虑<代码> STD::转换< /Cord>:不确定,但我倾向于通过SGEMAE在GET()上使用DeXType——这是我要做的第一件事。如果你将共享转换成弱指针,无论如何,你应该使用Cor,而不是使用来自<代码> GET()的原始指针< /代码>,这使得整个问题都不起作用。我用弱ptr这个术语与原始指针并列使用。我将在我的帖子中对其进行编辑。重载基于值\u类型与共享\u ptr相等(通过将此类型检测为M的一部分)如何定义两个
make\u raw
重载,一个获取共享指针并返回
.get()
的结果,一个获取原始指针并返回参数,并从单个函数模板调用它
MapToVector()
?另外,考虑<代码> STD::变换< /代码>: