为什么我不能static_cast一个包含void *的元组到一个包含char *的元组?

时间:2018-11-29 18:16:28

标签: c++ casting stdtuple

在下面的代码中,我尝试将static_cast的{​​{1}}转换为std::tuple<void*, size_t>

std::tuple<char*, size_t>

该代码无法与#include <tuple> int main() { char data[] = {'a', 'b', 'c'}; size_t data_len = 3; const std::tuple<void*, size_t> a{static_cast<void*>(data), data_len}; const std::tuple<char*, size_t> b = static_cast<const std::tuple<char*, size_t>>(a); printf("a's first element is %p\n", std::get<0>(a)); printf("b's first element is %p\n", std::get<0>(b)); } g++ -std=c++17一起编译(使用最新的GCC和Clang版本)。在这两种情况下,编译器均指示无法完成静态转换。这是来自clang -std=c++17的错误示例:

clang

鉴于main.cc:9:13: error: no matching conversion for static_cast from 'const std::tuple<void *, size_t>' (aka 'const tuple<void *, unsigned long>') to 'const std::tuple<char *, size_t>' (aka 'const tuple<char *, unsigned long>') static_cast<const std::tuple<char*, size_t>>(a); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 可以是void*static_cast,不应该也可以将char*static_cast到{{1 }}?这仅仅是STL设计中的一个疏忽,还是有一些潜在的原因?

我在尝试寻找this StackOverflow question的根本原因时遇到了这个问题。

我要解决的问题是“是的,很奇怪,您应该向C ++标准委员会发送一封措辞谨慎的电子邮件,建议他们在将来的C ++标准中解决此问题”或“否,不需要此功能是因为X和Y”。

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是提供一个中间类,该中间类可以为您处理从$ kubectl describe pod alertmanager-example-0std::tuple<void*, size_t>的转换:

std::tuple<char*, size_t>

然后您可以按以下方式使用它:

class TupleConverter : public std::tuple<char*, size_t> {
public:
  TupleConverter(const std::tuple<void*, size_t>& t) : std::tuple<char*, size_t>(
      static_cast<char*>(std::get<0>(t)), std::get<1>(t)) {}
};