0

引用了这个问题:可以将枚举类转换为基础类型吗?.

在我的代码中,我有效地:

enum class STATE : short
{
    EMPTY,
    PRESENT,
    PARTIAL,
};

volatile STATE state;

然后我写 atypedef和 a static_assert

typedef volatile std::underlying_type<STATE> state_type;
static_assert (sizeof (state_type) == sizeof (short), "Error - unsafe for use with InterlockedCompareExchange16");

最后我尝试设置状态InterlockedCompareExchange16

if (InterlockedCompareExchange16 (static_cast<state_type *>(&state), STATE::PRESENT, STATE::EMPTY) == STATE::EMPTY)
{
}

我从 VS2012 收到以下错误:

  1. 我的static_assert失败抱怨state_type与大小不一样short

  2. 抱怨它static_cast不能从volatile STATE *state_type *

请任何人都可以给我任何关于如何最好地修复我的代码的指示吗?

4

1 回答 1

2

来自std::underlying_type

定义类型的成员 typedef 类型,它是枚举 T 的基础类型。

改成:

typedef typename std::underlying_type<STATE>::type state_type;
                                            //^^^^

强类型的动机enum class是防止转换为int,因此尝试转换为底层类型与enums 的预期用途冲突(请参阅强类型枚举(修订版 3))。

不使用操作系统特定的线程机制,而是使用std::atomic<>添加到 c++11 的模板:

std::atomic<STATE> state(STATE::EMPTY);
STATE expected(STATE::EMPTY);
if (state.compare_exchange_strong(expected, STATE::PRESENT))
{
    // 'state' set to 'PRESENT'.
}

这消除了对static_assert并且不需要任何铸造的要求。

于 2013-05-16T13:52:49.297 回答