Home / ぼやきごと / 2012-05-31 / C++:ビットフィールドのビット数を template 引数で指定
C++:ビットフィールドのビット数を template 引数で指定

C++:ビットフィールドのビット数を template 引数で指定

ふと「ビットフィールドのビット数を template 引数で指定できるのか?」と疑問に思った。
ビット数指定に求められる要件がコンパイル時定数であることなら template 引数でもいけるはず。

そんなわけで実際にやってみた。

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 
-
!
 
-
|
|
|
!
 
-
!
 
-
|
|
|
|
|
|
!
 
-
!
-
|
|
|
|
|
|
|
|
|
!
#include <iostream>
 
// ビット数 N のビットフィールド3つを持つ構造体
template<std::size_t N>
struct Data
{
    unsigned long value1 : N;
    unsigned long value2 : N;
    unsigned long value3 : N;
};
 
// Data<N> の内容出力
template<std::size_t N>
void printData(const Data<N>& data)
{
    std::cout
        << "Data<" << N << ">[size:" << sizeof(data) << "] = { "
        << data.value1 << ", "
        << data.value2 << ", "
        << data.value3 << " };"
        << std::endl;
}
 
// メイン関数
int main(int, char**)
{
    Data<1> data1 = { 1, 0, 1 };
    Data<13> data13 = { 2, 30, 400 };
    Data<22> data22 = { 5000, 60000, 700000 };
 
    printData(data1);
    printData(data13);
    printData(data22);
 
    return 0;
}

VC++2010でもgcc4.3.0でもコンパイル&リンクが通り、実行すると次のように出力された。

Data<1>[size:4] = { 1, 0, 1 };
Data<13>[size:8] = { 2, 30, 400 };
Data<22>[size:12] = { 5000, 60000, 700000 };

問題なく指定できるようだ。
だから何だという話ではあるけども。

Category: [プログラミング][C++] - 2012-05-31 05:27:56