gpt4 book ai didi

c++ - 在 C++11 中将 PrintContainer 预处理器定义转换为模板

转载 作者:行者123 更新时间:2023-11-30 01:40:56 25 4
gpt4 key购买 nike

我有以下预处理器定义:

#define PRINTARRAY(Type, Array, Stream, Separator) \
std::copy(std::begin(Array), std::end(Array), std::ostream_iterator<Type>(Stream, Separator))

我想将其转换为模板,以便它可以自动确定 ostream_iterator 的类型,因此我不必将其传入。

但是,我想知道该怎么做。我的主要问题是:

  • 让它与所有 STL 容器一起工作
  • 让它与普通数组一起工作(支持 std::begin/end 吗?)

我认为关键问题是 ostream_iterator,afaik,需要具有包含值的类型,而不是容器的类型。

有人有什么想法吗?谢谢。

最佳答案

您可以执行以下操作:

template <class Con, class Stream>
void print_container(const Con& container, Stream& stream, const typename Stream::char_type* c) {
using value_type = typename std::remove_reference<decltype(*std::begin(container))>::typ‌​e;
std::copy(std::begin(container), std::end(container), std::ostream_iterator<value_type>(stream, &c);
}

然后

std::vector<int> v{1,2,3};
print_container(v, std::cerr, " ");
int a [] = {4, 5, 6};
print_container(a, std::cerr, " ");

打印

1 2 3 4 5 6

我应该提一下,顺便说一下,当你说“所有 STL 容器”时,这仍然不能适用于所有 STL 容器,因为许多 STL 容器(就像所有的 map )实际上迭代了 std::pair的东西。和 std::pair没有 <<或任何等效的定义,因此这对那些不起作用。

关于c++ - 在 C++11 中将 PrintContainer 预处理器定义转换为模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42396109/

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