ビットフィールドのアドレスは取れません。ほうほう、private アクセスできない感じかな?— ずみっくす :X (@srz_zumix) May 15, 2019
private メンバー変数の R/W テスト
まずはこちらをご覧ください。#include "iutest.hpp"
//origin>> #include "../../include/iutest.hpp"
#include <iostream>
int main(int argc, char** argv)
{
IUTEST_INIT(&argc, argv);
return IUTEST_RUN_ALL_TESTS();
}
class Test
{
private:
int A:12;
int B:4;
int C:4;
int D:12;
int E;
public:
Test()
: A(0x777)
, B(0x3)
, C(0x4)
, D(0x400)
, E(1)
{}
};
IUTEST_MAKE_PEEP(int Test::*, Test, E);
IUTEST(PeepTest, MemberVariable)
{
::Test test;
IUTEST_EXPECT_EQ(1, IUTEST_PEEP_GET(test, ::Test, E));
IUTEST_PEEP_GET(test, ::Test, E) = 4;
IUTEST_EXPECT_EQ(4, IUTEST_PEEP_GET(test, ::Test, E));
}
private メンバーである Test::E への書き込み・読み込みができていることがわかると思います。
private メンバー変数(ビットフィールド)の R/W テスト
続いて、上でアクセスしている private 変数を E から A に変えてみます。IUTEST_MAKE_PEEP(int Test::*, Test, A);
IUTEST(PeepTest, MemberVariable)
{
::Test test;
IUTEST_EXPECT_EQ(1, IUTEST_PEEP_GET(test, ::Test, A));
IUTEST_PEEP_GET(test, ::Test, A) = 4;
IUTEST_EXPECT_EQ(4, IUTEST_PEEP_GET(test, ::Test, A));
}
今度はコンパイルエラーです。
解説
プライベートにアクセスした方法
上のコードで利用したテスティングフレームワークは iutest です。private メンバーへのアクセスはこのフレームワークの PEEP 機能を利用しています。
PEEP は template explicit instantiation で private にアクセス可能なことを利用して、private メンバーのアドレスを取得して実現しております。
詳しくは昔書いたこちらの記事を参考にしてください。(「ブログズミ: [C++] Private な関数のテスト」)
ビットフィールドにアクセスできなかった理由
error: address of bit-field requested
上記 PEEP の方法ではアドレスを取得できる必要があるため、アドレスが取れないビットフィールドではアクセスできないわけです。
(言語法律家によるアクセスが可能な場合はビットフィールドでもアクセスできますが・・ : https://wandbox.org/permlink/zYC1hAYuqqixaEUn)
0 件のコメント:
コメントを投稿