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

Casting a const parameter in a function pointer to a non const in C++

我有一个函数,无论调用 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 void *buf' 而 read(...) 使用 'void *buf'。因此这两个函数签名不匹配。有没有办法可以将函数签名转换为使它们匹配的东西?我考虑过将函数指针强制转换为 (void *),但它似乎不是最优雅的。或者,我可以使 handleTX(...) 成为一个宏,但它又不是很干净。还有其他建议吗?

write() 编写您自己的简单包装器,它采用非常量数据指针。然后你可以把它传递给 handleTX().

正如 John Zwinck 所说,您可以单独为 write() 使用包装器,或者您可以为 read()write() 实现包装器以完全抽象 read()write() 来自 unistd.h

您可以使用枚举来通过 handleTX()

来区分 read()write() 操作,而不是函数指针

拥有这样的通用签名是非常不合适的。这些函数做完全不同的事情并且对参数做不同的解释。摆脱 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); }

它是否有效取决于 'data' 是否总是可变的。这将匹配两者。