【发布时间】:2014-03-06 05:22:14
【问题描述】:
我也看到了我的问题的各种形式的回答/答复,但我仍然很难弄清楚如何省略我的编译器状态模棱两可的函数。
我有一个旨在处理数据流的类。我重载了 = 和 += 运算符,以便流类可以通过将其转换为模板类型 T 来使用其他类型的数据。
template<typename T>
class TStream
{
private:
typedef TBuffer<T> stream_buffer;
stream_buffer mStream;
public:
TStream();
TStream(const TStream &rhs);
TStream::~TStream();
unsigned int Size() const;
unsigned int ByteStreamLength() const;
void Clear();
// some methods omitted for brevity
const T&operator[](unsigned int idx);
const T*operator[](unsigned int idx) const;
TStream<T> &operator=(const TStream &rhs);
TStream<T> &operator=(T const);
TStream<T> &operator=(unsigned char);
TStream<T> &operator=(bool);
TStream<T> &operator=(double);
// rest omitted for brevity
};
这样做
TStream<unsigned char> ByteStream
与
造成歧义operator=(unsigned char).
如果 T = unsigned char,我基本上希望 operator=(unsigned char) 被省略。
这篇文章似乎提供了一种方法: http://www.drdobbs.com/function-overloading-based-on-arbitrary/184401659
但是很难遵循它,因为我不想改变我的返回类型。
我通常像这样使用 TStream:
TStream<unsigned byte> ByteStream;
ByteStream+= int
ByteStream+= char
... 等等,我以同样的方式重载 +=。我推断传入的大小并将其转换为 T。我这样做是为了避免为简单的 POD 案例传递一个 void * 和一个长度参数。
【问题讨论】:
-
这是什么?
TStream::~ptiStream(); -
@BrianBi:哎呀,错字了。我正在修剪帖子的代码,那是模板类的旧名称。我进行了编辑以修复它。
-
@BrianBi:因为泛型 T 可能是 unsigned char 类型,我希望能够附加到流中,例如 int 类型。在这种情况下,流将消耗 sizeof(int) ... int 类型将转换为 sizeof(int) 字节并添加到流中。
-
是的,对不起,我看错了你的代码。我删除了我的评论。
-
您可能希望 (a) 为该参数使用
T const&,并 (b) 指定您正在使用的工具链。
标签: c++ templates specialization