iostream是否使用重载或模板?

时间:2013-12-02 20:01:32

标签: c++ templates system-calls overloading

我正在努力让我的班级的write()系统调用更容易一些。它不会采取 目标和大小参数,而只是对象。模板似乎是最好的解决方案,但在处理数组时遇到了一些麻烦,例如: C ++ I / O函数也必须管理这种情况,然后我想知道它们是如何实现的。我们并不关心编译模板和重载基本相同。 我也会重载<<运算符,使语法变甜使其更易于使用。

该功能应如何工作
成员函数应该允许您将数据发送到某个fd。它应该是这样的:

string s = "Hello World!";
double array[10];
int s = 50;
send(s); 
send(array);
send(s);

对于字符串,我已经为const char*重载了该函数,并且它有效(strlen在这种情况下比sizeof要好得多。)

2 个答案:

答案 0 :(得分:1)

IOStreams没有处理数组的任何重载。流可以处理C样式的字符串,即,当使用宽字符流时,指向char(或wchar_t的空字符终止序列的指针。那说你可以推断出C ++中静态大小的数组的大小:

template <typename T, std::size_t Size>
void print_size(T (&array)[Size]) {
    std::cout << "size=" << Size << '\n';
}

但请注意,我认为使用上述模板来确定需要写入的内存量是个好主意:只需清楚地写入构成对象的字节仅适用于POD,即使这样也是一个坏主意,因为对于对象的布局几乎没有保证。你总是更好地序列化对象,其中序列化表示可能是二进制表示,它非常接近于[当前]在内存中表示对象的方式。然而,确切地指定数据如何被序列化具有益处,例如,当数据需要在平台之间传输时。当然,这种情况永远不会发生 - 直到它发生:如果软件是好的,那么在系统之间传输数据是必要的。

另一个实现是普通数组实际上并不常见。相反,正在使用不同的容器。为了将它们立即序列化,真正需要的是一个范围抽象,数组只是变成一种特殊的数组。

答案 1 :(得分:0)

作为旁注,因为我认为DietmarKühl的答案足以回答你的“主要”问题,一个更合适的函数接口,使用array作为参数{{1}声明为array的{​​{1}}是double array[10];(我没有考虑指针vs指向这个界面的指针问题指针,它只是一个玩具示例来显示差异)。

我的观点是,就声明作为一种类型而言,数组与foo (double * const array)更相似而不是T* const,根据我的经验,许多人混淆了两种声明,认为数组更多就像最后一个而不是第一个。

你可以放心地假设

const T *

是与

几乎完全相同的声明
double arr[10];

唯一真正的区别在于,对于最后一个,你没有为double * const arr; 的其他9个引用获得额外的9个位置,其中第一个分配给定大小的contiguos大块内存给定的double