gpt4 book ai didi

c++ - 有没有更好的方法来检查 STL 容器是否是多*容器

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:49 28 4
gpt4 key购买 nike

在为适用于各种标准 C++11 容器的框架编写单元测试期间,我跨过了我想以通用方式创建测试数据的问题。这里我需要知道关联容器 C 是否是 multi* 容器。例如。如果 C 是 std::set 或 std::multiset。我搜索了所有这些容器的接口(interface),它们的共同点是它们都有一个 insert(value_type const&) 方法。但从我的角度来看,显着的区别在于 multi* 版本只返回一个迭代器,而“非”multi* 版本返回一个 std::pair。所以我选择这个作为差异化因素。

我的结果代码是:

#include <type_traits>
#include <utility>

template <typename Container>
class is_multi_container
{
typedef typename Container::value_type T;
typedef typename Container::iterator ExpectedType;
typedef decltype(Container().insert(T())) ResultType;
public:
static const bool value = std::is_same<ResultType, ExpectedType>::value;
};

#include <iostream>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>

int main() {
std::cout << "std::set<T> is " << is_multi_container<std::set<int>>::value << std::endl;
std::cout << "std::multiset<T> is " << is_multi_container<std::multiset<int>>::value << std::endl;

std::cout << "std::map<K,T> is " << is_multi_container<std::map<int,double>>::value << std::endl;
std::cout << "std::multimap<K,T> is " << is_multi_container<std::multimap<int,double>>::value << std::endl;

std::cout << "std::unordered_set<T> is " << is_multi_container<std::unordered_set<int>>::value << std::endl;
std::cout << "std::unordered_multiset<T> is " << is_multi_container<std::unordered_multiset<int>>::value << std::endl;

std::cout << "std::unordered_map<K,T> is " << is_multi_container<std::unordered_map<int,double>>::value << std::endl;
std::cout << "std::unordered_multimap<K,T> is " << is_multi_container<std::unordered_multimap<int,double>>::value << std::endl;
}

根据这个小测试程序,它似乎可以工作,但我不确定 a) 这个解决方案是否存在我目前没有看到的问题,以及 b) 是否有更优雅的方式来编写这样的特征?我知道该特征仅适用于关联容器。

非常感谢!

PS.: 我必须使用 Visual Studio 2010。

最佳答案

鉴于 std::multi* 容器的数量有限,您可以只列出它们:

#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>

#include <type_traits>

template <typename Container>
struct is_multi_container :
std::false_type
{};

template <typename T, typename Compare, typename Alloc>
struct is_multi_container<std::multiset<T, Compare, Alloc>> :
std::true_type
{};

template <typename T, typename Compare, typename Alloc>
struct is_multi_container<std::multimap<T, Compare, Alloc>> :
std::true_type
{};

template <typename T, typename Compare, typename Alloc>
struct is_multi_container<std::unordered_multiset<T, Compare, Alloc>> :
std::true_type
{};

template <typename T, typename Compare, typename Alloc>
struct is_multi_container<std::unordered_multimap<T, Compare, Alloc>> :
std::true_type
{};

更多行代码,但它易于阅读且推理直接(即,它绝对有效!)。

作为一个显式列表,需要注意的是它不会自动扩展自身。为此,您的解决方案很好。 C++14 可能有一个 AssociativeContainer 概念,这会让这更容易;对此的研究留给读者作为练习。 ;)

例子:

#include <iostream>
#include <iomanip>

int main()
{
std::cout << std::boolalpha;

#define TEST(type, ...) \
std::cout << type " is: " \
<< is_multi_container<__VA_ARGS__>::value \
<< std::endl

TEST("std::set<T>", std::set<int>);
TEST("std::multiset<T>", std::multiset<int>);

TEST("std::map<K,T>", std::map<int, double>);
TEST("std::multimap<K,T>", std::multimap<int, double>);

TEST("std::unordered_set<T>", std::unordered_set<int>);
TEST("std::unordered_multiset<T>", std::unordered_multiset<int>);

TEST("std::unordered_map<K,T>", std::unordered_map<int, double>);
TEST("std::unordered_multimap<K,T>", std::unordered_multimap<int, double>);
}

输出:

std::set<T> is: false
std::multiset<T> is: true
std::map<K,T> is: false
std::multimap<K,T> is: true
std::unordered_set<T> is: false
std::unordered_multiset<T> is: true
std::unordered_map<K,T> is: false
std::unordered_multimap<K,T> is: true

关于c++ - 有没有更好的方法来检查 STL 容器是否是多*容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16993567/

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