![](/img/trans.png)
[英]What is the C++14 alternative to C99 compound literals, without using dynamic allocation?
[英]C++ equivalent to C99 Compound Literals
我是现代 C++ 的新手。我正在编写一个序列化程序,需要写出一个字节(分隔符)。 在 C99 中,我会使用复合文字来保存值,如下所示:
enum {
TAG_DELIMITER,
// ...
TAG_MAX
};
void write_buf(out_buf *dest, char *src, size_t n);
void encode(out_buf *buf, user_data *d) {
// ... Write out user data
write_buf(buf, &(char){TAG_DELIMITER}, sizeof(char));
}
在 C++ 中,设置类似:
class UserData {
public:
// ... Some data
void encode(std::ostream &buf) {
// ... Write out user data
char tmp = TAG_DELIMITER;
buf.write(&tmp, sizeof(tmp));
}
}
声明一个tmp
变量感觉很笨拙。 这没什么大不了的,如果我真的很在意的话,我可以使用扩展来启用复合文字。 但是我缺少一种“C++-ish”的方法吗? 针对 GCC 10.1 上的 C++20
编辑:澄清一下,枚举中的值在整个代码库中使用,因此我不会将它变成 class 中的一堆 constexprs。无论如何,这只是将我的tmp
变量移动到 static class 成员中,这真的好不到哪里去。
这个问题也许会更好地表述为“有没有办法在 C++ 中声明和获取匿名变量的地址?” 我认为答案是否定的。
无论如何,评论是正确的,我在这里真正想要的只是ostream.put(TAG_DELIMITER)
,它巧妙地避开了整个问题。
您可以使用constexpr
:
class UserData {
public:
constexpr static char TAG_DELIMITER = 'a';
// ... Some data
void encode(std::ostream &buf) {
// ... Write out user data
const char * tmp = &TAG_DELIMITER;
buf.write(tmp, sizeof(char));
}
};
但是,当您尝试获取其地址时,您需要使用const char *
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.