gpt4 book ai didi

c++ - 在 C++ 中将多个模板类型传递给运算符<<

转载 作者:行者123 更新时间:2023-11-30 04:07:38 26 4
gpt4 key购买 nike

是否可以这样写print功能,按原样使用 operator<< .我有一些可以以各种方式存储的图像数据,包括作为无符号字符。打印时我想投 unsigned char值为 int , 所以它显示正确。但是,我只需要为 unsigned char 指定一个类型,所以我使用默认的模板参数。

我用过 std::vector用于说明目的。这实际上是一个包含像素数据的缓冲区,直到运行时我才能确定其类型,所以我将始终指定源类型 T .

我意识到我可以为数据类型为 unsigned char 的情况编写专门化, 但想知道是否有可能合并成一个通用的 operator<<功能,尽可能使用 print

template<typename T, typename U = T>
std::ostream& print(std::ostream& os, const std::vector<T>& vals)
{
for (auto v : vals) {
os << U{v} << ' '; // Warns on narrowing conversion.
}

return os;
}

使用如下代码调用,

vector<unsigned char> vc{ 1, 2, 3 };
vector<int> vi{ 4, 5, 6 };

print<unsigned char, int>(vc);
print<int>(vi);

我尝试用运算符<<替换打印,但错误消息提示我与basic_ostream发生冲突的声明(template <class charT, class traits = char_traits<charT>> class basic_ostream)。

最佳答案

在 C++11 中,您可以使用一个简单的 std::conditionalstd::is_same<T, unsigned char>作为您永远不需要覆盖的默认模板参数。这意味着您可以使用熟悉的 <<流语法

#include <iostream>
#include <type_traits>
#include <vector>

template
<
class T,
class U = typename std::conditional<std::is_same<T, unsigned char>::value, int, T>::type
>
std::ostream& operator<<(std::ostream& os, std::vector<T> const& vals)
{
for (auto v : vals) {
os << U{v} << ' ';
}

return os;
}

int main()
{
auto const vc = std::vector<unsigned char>{ 1, 2, 3 };
auto const vi = std::vector<int>{ 4, 5, 6 };

std::cout << vc << "\n";
std::cout << vi << "\n";
}

Live example .

Boost equivalents以防你被绑定(bind)到 C++98。

关于c++ - 在 C++ 中将多个模板类型传递给运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22374379/

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