gpt4 book ai didi

c++ - 如何在 C++ 中为数组重载运算符<<?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:16 25 4
gpt4 key购买 nike

我正在尝试这样做:

template <typename T>
ostream &operator<<(ostream &os, T &arr)
{ /*...*/ }

但是可以T代表一个数组?重载 << 是否正确?数组的运算符?


编辑:

根据 Kerrek SB 的建议,这是我对 << 的实现:

template <typename T, unsigned int N>
ostream &operator<<(ostream &os, const T (&arr)[N])
{
int i;
for(i = 0; i < N; i++)
os << arr[i] << " ";
os << endl;
return os;
}

我的实现是否正确?我遇到编译错误。

最佳答案

你可以这样做:

template <typename T, unsigned int N>
std::ostream & operator<<(std::ostream & os, const T (&arr)[N])
{
// ..
return os;
}

当然,这仅适用于编译时数组。请注意,当 T 时不允许实例化此模板。是内置类型或 std 中的类型命名空间!

如果可能的话,最好使这个内联,因为你会为每个 N 产生一个单独的实例化。 . (pretty printer 有这样的例子。)

不过,您会注意到,一揽子模板引入了歧义,因为 os << "Hello"现在有两个可能的重载:模板匹配 const char (&)[6] ,以及衰减到指针的(非模板)重载 const char * , 它们都具有相同的转换序列。我们可以通过禁用 char 数组的重载来解决这个问题:

#include <ostream>
#include <type_traits>

template <typename T, unsigned int N>
typename std::enable_if<!std::is_same<T, char>::value, std::ostream &>::type
operator<<(std::ostream & os, const T (&arr)[N])
{
// ..
return os;
}

事实上,为了更加通用,您还可以制作 basic_ostream参数模板参数:

template <typename T, unsigned int N, typename CTy, typename CTr>
typename std::enable_if<!std::is_same<T, char>::value,
std::basic_ostream<CTy, CTr> &>::type
operator<<(std::basic_ostream<CTy, CTr> & os, const T (&arr)[N])
{
// ..
return os;
}

鉴于T必须是用户定义的类型,您甚至可以替换 is_same<T, char>is_fundamental<T>进行更多检查(但用户仍然不能将其用于标准库类型的数组)。

关于c++ - 如何在 C++ 中为数组重载运算符<<?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7439175/

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