gpt4 book ai didi

reference_wrapper 容器的 c++ 模板特化

转载 作者:行者123 更新时间:2023-11-28 01:31:26 28 4
gpt4 key购买 nike

#include "stdafx.h"

#include <algorithm>

class MyClass {
};

template <typename C, typename V, typename Enable = void>
static bool Contains(const C& container, const V& value) {
auto iter = std::find(container.begin(), container.end(), value);
auto result = (iter != container.end());
return result;
}

template <typename C, typename V,
typename std::enable_if<std::is_same<std::reference_wrapper<const V>, typename C::value_type>::value, bool>::type>
static bool Contains(const C& container, const V& value) {
auto iter = std::find_if(container.begin(), container.end(), [&](auto& aValue) {
return (aValue.get() == value);
});
auto result = (iter != container.end());
return result;
}

int main() {
const MyClass a;
auto container = {
std::reference_wrapper<const MyClass>(a),
};
Contains(container, a);
return 0;
}

编译器:VC++2015U3

编译错误:

Severity Code Description Project File Line Suppression State Error C2678 binary '==': no operator found which takes a left-hand operand of type 'const std::reference_wrapper' (or there is no acceptable conversion) ConsoleApplication1 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 3258

它遇到第一个实现而不是第二个实现。

对此有什么想法吗?

最佳答案

也许您还需要 operator==() 用于 MyClass 但是,要解决特化问题,我认为最好使用显式特化

template <template <typename...> class C, typename V>
static bool Contains (C<std::reference_wrapper<V const>> const & container,
V const & value) {
auto iter = std::find_if(container.begin(), container.end(), [&](auto& aValue) {
return (aValue.get() == value);
});
auto result = (iter != container.end());
return result;
}

而不是 SFINAE。

因为如果您还让 SFINAE 工作以启用 reference-wrapper-container 版本,例如

template <typename C, typename V> 
static std::enable_if_t<std::is_same<std::reference_wrapper<const V>,
typename C::value_type>::value, bool>
Contains (const C& container, const V& value)

Contains() 函数的两个版本都匹配调用

 Contains(container, a);

没有人是首选。

关于reference_wrapper 容器的 c++ 模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51380766/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com