在函数指针中将const参数转换为C ++中的非const

时间:2015-01-27 06:14:50

标签: c++ function pointers const

无论是调用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(...)成为一个宏,但它又不是很干净。还有其他建议吗?

3 个答案:

答案 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()操作