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>
template<std::size_t N>
struct Data
{
unsigned long value1 : N;
unsigned long value2 : N;
unsigned long value3 : 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 };
問題なく指定できるようだ。
だから何だという話ではあるけども。