1つのホストが1バイトのコマンドを受信できるプロトコルを実装しています。
バイトには256の可能な値がありますが、有効な値はごくわずかです。
もちろん、私は次のようなものを書くことができます:
bool is_valid(uint8_t command)
{
switch (command)
{
case 0x00:
case 0x01:
case 0xa0:
case 0xa1:
return true;
}
return false;
}
受信したコマンドの有効性を実行時に確認します。
残念ながら、これらのコマンドのすべての名前のリストも維持する必要があります。これにより、非常に近い別の関数を作成する必要is_valid()
がありますが、代わりにコマンドの名前が返されます。そうすることで、有効なコマンドのリストを複製することになりますが、私はそれが好きではありません。
メタプログラミングを使って有効なコマンドを一度だけ宣言する方法があるのではないかと思いました。
何かのようなもの:
template <uint8_t Value>
struct valid_value_type;
struct valid_value_type<0x00> { static const std::string name = "Stop command"; };
struct valid_value_type<0x01> { static const std::string name = "Start command"; };
is_valid()
しかし、満足のいくもの(「コンパイルと動作」を理解)に到達できず、これらのテンプレート宣言の存在を自動的に考慮する適応関数を生成する方法がわかりません。
それも可能ですか?もしそうなら、あなたはそれをどのように行いますか?
注:残念ながらC ++ 11はオプションではありませんが、好奇心からこのソリューションにも興味があります。