gpt4 book ai didi

c++ - 通过引用修改作用域枚举

转载 作者:太空狗 更新时间:2023-10-29 23:15:13 24 4
gpt4 key购买 nike

我越来越发现范围枚举难以使用。我正在尝试编写一组函数重载,包括一个用于通过引用设置/初始化值的作用域枚举的模板——像这样:

void set_value(int& val);
void set_value(double& val);
template <typename ENUM> set_value(ENUM& val);

但是,我不太明白如何在不引入多个临时值的情况下编写 set_value 的模板化版本:

template <typename ENUM>
set_value(ENUM& val)
{
std::underlying_type_t<ENUM> raw_val;
set_value(raw_val); // Calls the appropriate "primitive" overload
val = static_cast<ENUM>(raw_val);
}

我相信 static_cast 除了 raw_val 之外还引入了第二个临时值。我想编译器可能会优化其中之一或两者,并且在任何情况下它在性能方面都不应该有太大差异,因为 set_value 调用也会生成临时值(假设它不是内联的),但这看起来仍然不够优雅。我喜欢做的事情是这样的:

template <typename ENUM>
set_value(ENUM& val)
{
set_value(static_cast<std::underlying_type_t<ENUM>&>(val));
}

...但这是无效的(相应的代码也不是直接使用指针而不是引用),因为作用域枚举不通过继承与其底层原语相关。

我可以使用 reinterpret_cast,从一些初步测试来看,它似乎可以工作(而且我想不出它为什么不起作用的任何原因),但这似乎不受欢迎在 C++ 中。

是否有“标准”方法来做到这一点?

最佳答案

I could use reinterpret_cast, which, from some preliminary testing, appears to work (and I can't think of any reason why it wouldn't work), but that seems to be frowned upon in C++.

确实,reinterpret_cast 是违反严格别名规则的未定义行为。

消除单个 mov 指令(或者,或多或少,复制寄存器的数据值)是过早的微优化。编译器很可能能够处理它。

如果性能真的很重要,那么遵循优化过程:剖析、反汇编、理解编译器的解释,并在定义的规则内与它一起工作。

乍一看,您(和编译器)可能更容易使用像 T get_value() 这样的函数而不是 void set_value(T)。数据流和初始化更有意义,尽管类型推导丢失了。如果这真的很重要,您可以通过标签类型重新获得扣除额。

关于c++ - 通过引用修改作用域枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30250583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com