2 가지 프로토콜을 처리 할 수있는 통신 클래스가 있습니다. 프로토콜은 열거 형 템플릿 변수에 의해 선택됩니다. 이제 2 개의 프로토콜 중 1 개는 2 바이트 값만 지원하고 다른 프로토콜은 4 바이트 값을 지원합니다. 통신은 템플릿 멤버 함수를 통해 수행됩니다. 클래스 전문화 (= 선택된 프로토콜)에 따라 2 바이트 또는 4 바이트를 사용하도록 static_assert를 변경하는 방법은 무엇입니까?템플릿 enum 매개 변수를 기반으로 동작 변경
#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;
}
};
편집 : 1 답을 올바른 것으로 선택할 수 있습니다. 그리고 Roy에게서 가장 많은 것을 배웠지 만 가능한 한 간단하게 유지하기 때문에 MM의 답을 골랐습니다.
왜 궁극적으로 두 배 또는 (긴) 긴 정수를 부동 소수점으로 다운 캐스팅하는 경우 템플릿이 필요한가요? 어쩌면 그냥 float을 수락하고 호출자에게 필요한 경우 클래스를 사용할 때 그의 정밀도에 어떤 일이 일어날 지 궁금해하는 최종 컴파일러 경고를 허용하는 것이 좋습니다. –
@MichaelRoy이 라이브러리는 Arduino 사용자를 대상으로합니다. 필자는 컴파일러 경고 (기본적으로 비활성화 됨)를 살펴 본다. 그러나 당신은 매우 유효한 포인트를 가지고 있습니다! 나는 프로그램의 디자인을 조사 할 것이다. – BMelis
'((P == P1)? 2 : 4)'도 아마 괜찮을 것입니다. –