teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ビットフラグについて追記

2021/07/13 10:06

投稿

int32_t
int32_t

スコア21929

answer CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  > (2) デメリットはC言語で利用できないという一点でしょうか?
9
9
 
10
- 少々コードが長くなることがあります。
10
+ 少々コードが長くなることがあります。
11
11
  ```cpp
12
12
 
13
13
  class Foo {
@@ -27,6 +27,21 @@
27
27
  前者は `Foo::kApple` で参照できますが、後者は`Bar::Type::kApple`と書かないといけません。
28
28
  (前者はクラス内で定義されているので、長い名前を付ける必要がない)
29
29
 
30
+ ●enum classでは簡単に整数演算ができないので、ビットフラグを表現するのは現実的ではありません。
31
+
32
+ ```cpp
33
+
34
+ enum class FooFlags {
35
+ kFlag1 = 1 << 0,
36
+ kFlag2 = 1 << 1,
37
+ kFlag3 = 1 << 2,
38
+ };
39
+
40
+ FooFlags flags = ...;
41
+ if (flags & FooFLags::kFlag2) { // できない
42
+ ```
43
+
44
+
30
45
  > (3) enum classを使うことでenumより速度が落ちるなどあるのでしょうか? (プリプロセッサーが捌く範囲で関係ないでしょうか?)
31
46
 
32
47
  ありません。

1

文言

2021/07/13 10:06

投稿

int32_t
int32_t

スコア21929

answer CHANGED
@@ -12,19 +12,20 @@
12
12
 
13
13
  class Foo {
14
14
  enum Type {
15
- kType1,
15
+ kApple,
16
- kType2
16
+ kOrange
17
17
  };
18
18
  }
19
19
 
20
20
  class Bar {
21
21
  enum class Type {
22
- kType1,
22
+ kApple,
23
- kType2,
23
+ kOrange,
24
24
  };
25
25
  };
26
26
  ```
27
- 前者は `Foo::kType1` で参照できますが、後者は`Bar::Type::kType1`と書かないといけません。
27
+ 前者は `Foo::kApple` で参照できますが、後者は`Bar::Type::kApple`と書かないといけません。
28
+ (前者はクラス内で定義されているので、長い名前を付ける必要がない)
28
29
 
29
30
  > (3) enum classを使うことでenumより速度が落ちるなどあるのでしょうか? (プリプロセッサーが捌く範囲で関係ないでしょうか?)
30
31