2017-03-16 9 views
0

C++でハードウェア抽象化レイヤを実装するためのデザインパターンやテクニックの提案がありますので、ビルド時に簡単にプラットフォーム間を切り替えることができますか?私はGoFやC++のテンプレートで読んだブリッジパターンのようなものを使うことを考えていましたが、これが最善の選択肢かどうかは分かりません。C++でHALを実装するためのデザインパターン

答えて

1

ビルド時にブリッジパターンを使用するのは良い選択ではないと思います。

class Device { 
    ... // Common functions 
}; 

X86プラットフォームの場合:

#ifdef X86 // X86 just is an example, user should find the platform define. 
class X86Device: public Device{ 
    ... // special code for X86 platform 
}; 
#endif 

ARMプラットフォームの場合:

#ifdef ARM // ARM just is an example, user should find the platform define. 
class ARMDevice: public Device { 
    ... // Special code for ARM platform 
}; 
#endif 

は、インターフェースなどの標準的なデバイスクラスを定義します。

この

は私のソリューションです。

HESEデバイス:

#ifdef X86 
Device* dev = new X86Device(); 
#elif ARM 
Device* dev = new ARMDevice(); 
#endif 

コンパイルオプション:より多くのアイデアについては

$ g++ -DARM ... // using ArmDevice 
$ g++ -DX86 ... // using X86Device 
+4

コンパイル時にターゲットCPUが分かっているのであれば、どうして動的ポリポルフィズムに訴えるのでしょうか?あなたはあらゆる面から失う! –

+0

合意!さらに、#ifdef – Jeff

+0

X86とARM上のSFINAEは単なる例ですが、これらはPAX255、IT3354と置き換えることができます。デバイスには、異なるプラットフォームのドライバのソースコードは、初期プロセスと同じような重要な点を除いてほぼ同じです。私はこれらのコードをすべてクラスやファイルで別々のプラットフォームに書くことができますが、コードメンテナンスの面では良い選択ではありません@DavidHaim – netdigger