きたけんブログ

旅と趣味と

列挙型の並列を引数にとる

ライブラリなんかを使っていると、関数の引数に「CS_HREDRAW | CS_VREDRAW」というように、オプションを複数個指定できる場合がありますよね。これを自分の関数でも導入したいと思って、使い方を調べてみました。

#include <iostream>
using namespace std;
enum LIST {
  ITEM_0 = 0x01,
  ITEM_1 = 0x02,
  ITEM_2 = 0x04,
  ITEM_3 = 0x08,
  ITEM_4 = 0x10,
  ITEM_5 = 0x20
};
void FunctionA(int lst)
{
  cout << (ITEM_0 & lst) << endl;
  cout << (ITEM_1 & lst) << endl;
  cout << (ITEM_2 & lst) << endl;
  cout << (ITEM_3 & lst) << endl;
  cout << (ITEM_4 & lst) << endl;
  cout << (ITEM_5 & lst) << endl;
}
int main(int argc, char* argv[])
{
  FunctionA(ITEM_0 | ITEM_2 | ITEM_3);
  return 0;
}

まず列挙型で引数に使いたい要素を書き下します。その際値を指定するのですが、各値が2進数での値で0と1が被らないよう設定する必要があります。0x01 = 000001、0x02 = 000010、0x04 = 000100、0x08 = 001000、0x10 = 010000、0x20 = 100000のような感じです。

引数に各要素が含まれているかを調べる場合は(ITEM_0 & lst)を演算させて、0だったら偽、それ以外なら真となります。

実行結果はこんな感じです。

1
0
4
8
0
0

いちいち引数にboolを羅列するのもあほらしいので、これは便利かもしれません。