Ich möchte eine effiziente Möglichkeit schreiben, 0 und 1 in einem Byte (oder einem anderen Typ) zu schreiben.Wie schreibe ich eine Bitmaske in C++ 14 mit (so etwas wie?) Variadic Vorlagen
Zum Beispiel in C wir so etwas wie schreiben:
uint8_t x = 0x00;
x|= (1 << 2) | (1 << 4);
schreiben 1 in Bits 2 und 4 (natürlich, verwenden Sie nicht 2 und 4, aber Makros verwenden, um das erinnern Bedeutung der Bits 2 und 4).
Ich mag diese Vorgehensweise nicht, so schreibe ich die folgende variadische Vorlage:
template<typename T>
T bitmask(T p0)
{
return (1 << p0);
}
template<typename T, typename...Position>
T bitmask(T p0, Position... p1_n)
{
return (1 << p0)|bit_mask(p1_n...);
}
template<typename T, typename... Position>
T& write_one(T& x, Position... pos0_n)
{
x|= bit_mask(pos0_n...);
return x;
}
und diese Arbeit gut. Sie können etwas wie dieses schreiben:
uint8_t x = 0x00;
write_one(x, 2, 4);
Aber ich hatte eine andere Lösung bevorzugt. Ich möchte so etwas schreiben:
write_one<uint8_t>(x, 2, 4); // if x is uint8_t
write_one<uint16_t>(x, 2, 4); // if x is uint16_t
Die Art der write_one ist die Art von x (ok, ich kenne Sie nicht die Art uint8_t und uint16_t schreiben müssen, ist es für mich Klarheit geschrieben). Die anderen Parameter sind immer Zahlen (tatsächlich sind sie uint8_t).
Wie kann ich diese erreichen?
Ich möchte Code wie folgt schreiben:
template<typename T>
T bitmask(uint8_t p0)
{
return (1 << p0);
}
template<typename T>
T bitmask(T p0, uint8_t... p1_n)
{
return (1 << p0)|bit_mask<T>(p1_n...);
}
template<typename T>
T& write_one(T& x, uint8_t... pos0_n)
{
x|= bit_mask<T>(pos0_n...);
return x;
}
Ihnen sehr danken.
haben Sie den Assembler Ausgang geprüft, was Sie bisher getan haben? Sie werden überrascht sein, wie gut der Compiler ist –