【问题标题】:Casting a const parameter in a function pointer to a non const in C++将函数指针中的 const 参数强制转换为 C++ 中的非 const
【发布时间】:2015-01-27 06:14:50
【问题描述】:

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

【问题讨论】:

  • readwrite 函数可能具有 相似 签名,但它们在语义上非常不同(如它们的参数所示)。 handleTX 将如何处理这些截然不同的功能?
  • 至于你的问题,你可能想看看有多少标准 C++ 函数处理未知的“函数”,例如std::for_each

标签: c++ function pointers constants


【解决方案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); }

它是否会起作用取决于“数据”是否总是可变的。这将匹配两者。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      您可以使用枚举来区分read()write() 操作,而不是函数指针,handleTX()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 2023-03-20
        • 2020-07-15
        • 2015-09-10
        • 1970-01-01
        • 2015-04-15
        • 2010-12-14
        相关资源
        最近更新 更多