私は2つの異なるプロトコルを扱うことができる通信クラスを持っています。プロトコルは、列挙型テンプレート変数によって選択されます。 2つのプロトコルのうち1つは2バイト値のみをサポートし、もう1つは4バイト値をサポートします。 コミュニケーションは、テンプレートメンバー関数を介して行われます。 static_assertをどのように変更すると、クラスの特殊化(=選択されたプロトコル)に応じて2または4バイトかかりますか?テンプレートの列挙型パラメータに基づいて動作を変更します
#include <iostream>
#include <math.h>
enum Protocol { P1, P2 };
template <Protocol P>
class Communicator {
public:
template <typename T>
void communicate(T arg) {
static_assert(sizeof(arg) <= sizeof(float), "argument size must be <= 4 bytes");
float value = (float)arg;
uint8_t length = sizeof(arg); //length in bytes
_communicate(value, length);
}
void _communicate(float f, uint8_t length) {
std::cout << f;
}
};
EDIT:1つの答えを正しいものとして選ぶことができます。そして、私はRoyから最も多くを学んだが、できるだけシンプルにするため、MMの答えを選んだ。 (かかわらず、両方のupvoted)
最終的な倍精度浮動小数点型(long)整数を浮動小数点数にダウンキャストするだけの理由はなぜですか?たぶんfloatを受け入れ、必要に応じてクラスを使用するときに正確に何が起きるかを最終的なコンパイラの警告で正確に伝えることが最善の方法でしょう。 –
@MichaelRoyこのライブラリはArduinoユーザーを対象としています。私は彼らがコンパイラの警告(デフォルトでは無効になっている)を見るのは間違いです。しかし、あなたは非常に有効なポイントを持っています!私はプログラムのデザインを調べます。 – BMelis
'((P == P1)?2:4)'おそらく –