gpt4 book ai didi

c++ - 标准库中有多少种不同的类模板排列?

转载 作者:行者123 更新时间:2023-11-28 02:56:45 24 4
gpt4 key购买 nike

假设我想做一些人为设计的事情:

template<typename T, template <typename, typename> class Cont>
std::ostream& operator<<(std::ostream& os, Cont<T, std::allocator<T>> cont)
{
for (const auto& el : cont)
std::cout << el << "\n";
return os;
}

template<typename T, template <typename, typename> class Cont>
std::ostream& operator<<(std::ostream& os, Cont<T, std::deque<T>> cont)
{
while (!cont.empty())
{
std::cout << cont.top() << "\n";
cont.pop();
}
return os;
}

我意识到我可以做到 std::vector<T>std::stack<T>但据我了解,dequevector例如具有相似的界面。第一次重载将接受 deque , forward_listvector .所以我的问题是,是否有一个简单的列表或图表可以告诉我需要多少重载?

最佳答案

标准序列容器在 § 23.3.1 [sequences.general]/1 中列举:

The headers <array>, <deque>, <forward_list>, <list>, and <vector> define template classes that meet the requirements for sequence containers.

也就是说,我更喜欢使用特征来检测类序列和类堆栈类型的通用解决方案。我将任何具有成员的序列称为 beginend返回相同的类型:

template <bool B, typename T>
using enable_if =
typename std::enable_if<B, T>::type;

template <typename T>
struct is_sequence_helper {
template <typename U=T>
static auto test(int) ->
enable_if<
std::is_same<
decltype(std::declval<U>().begin()),
decltype(std::declval<U>().end())
>::value,
std::true_type
>;

template <typename U=T>
static auto test(...) -> std::false_type;
};

template <typename T>
using is_sequence =
decltype(is_sequence_helper<T>::test(0));

我们会和成员(member)说什么top , pop , 和 empty() const是一个堆栈:

template <typename T>
struct is_stack_helper {
template <typename U=T>
static auto test(int) ->
decltype((std::declval<U>().top(),
std::declval<U>().pop(),
std::declval<const U>().empty(),
std::true_type{}));

template <typename U=T>
static auto test(...) -> std::false_type;
};
template <typename T>
using is_stack =
decltype(is_stack_helper<T>::test(0));

有了这些特征,我们可以更一般地约束您的流插入运算符以处理序列或堆栈:

template<typename Sequence>
enable_if<
is_sequence<Sequence>::value && !is_stack<Sequence>::value,
std::ostream&
> operator<<(std::ostream& os, const Sequence& cont) {
os << "sequence version:\n";
for (const auto& el : cont)
os << el << '\n';
return os;
}

template<typename Stack>
enable_if<
is_stack<Stack>::value,
std::ostream&
> operator<<(std::ostream& os, Stack& cont) {
os << "stack version:\n";
for (; !cont.empty(); cont.pop())
os << cont.top() << '\n';
return os;
}

See it all pulled together and working at Coliru .

关于c++ - 标准库中有多少种不同的类模板排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804976/

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