无论是调用read(...)还是write(...)处理与文件描述符之间的传输,我都有一个行为几乎相同的函数。我想写一个这样的函数:
uint32_t handleTX(ssize_t (*func)(int, void *, size_t));
我还有两个功能:
uint32_t myRead() { return handleTX(::read); }
uint32_t myWrite() { return handleTX(::write); }
这是使用unistd.h中声明的函数。这个问题是write(...)使用了一个&const; const void * buf'而read(...)使用' void * buf'。因此,两个功能签名不匹配。有没有办法可以将函数签名转换为某些东西以使它们匹配?我想过将函数指针转换为(void *),但它看起来并不是最优雅的。或者,我可以使handleTX(...)成为一个宏,但它又不是很干净。还有其他建议吗?
答案 0 :(得分:1)
拥有像这样的通用签名是非常不合适的。这些函数完全不同,并对参数进行不同的解释。摆脱const不是正确的方法。
如果您的目标是对函数透明,只需在给定函数周围添加自己的前缀 - 后缀,最简单的方法是:
template <class Function>
uint32_t handleTX(Function f)
{
... do whatever you need
n = f(fd, data, size);
}
uint32_t myRead() { return handleTX(::read); }
uint32_t myWrite() { return handleTX(::write); }
它是否会起作用取决于'数据'是否总是可变的。这将匹配两者。
答案 1 :(得分:0)
为write()
编写自己的简单包装器,它接受一个非const数据指针。然后,您可以将其传递给handleTX()
。
答案 2 :(得分:0)
正如John Zwinck所说,你可以单独使用write()
的包装器,或者你可以为read()
和write()
实现包装,以完全抽象read()
和{{ 1}}来自write()
您可以使用枚举来代替功能指针,以unistd.h
read()
和write()
操作