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

标签 c++ function pointers constants

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

最佳答案

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

它是否有效取决于“数据”是否始终可变。这将匹配两者。

关于c++ - 在 C++ 中将函数指针中的 const 参数转换为非 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28164329/

相关文章:

c++ - 将 _stprintf_s 保存在一个 txt 文件中

c++ - 无法找到音频流

postgresql - 什么是 PostgreSQL 函数,我什么时候必须使用它们?

c - 线性搜索与 strlen

C 将结构体写入数组

c++ - 复制构造函数中的深层复制问题

c++ - 链接 Google TCMalloc 库的最安全方式

C 中执行函数的命令

function - 我用 Set.Fold F# 做错了什么

c++ - 指针的初始化