我正在努力让我的班级的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
要好得多。)
答案 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
。