Zum Beispiel, hier ist mein Thread Barriere/Abschnittsart SacheKann ich einige Variablen Vorlage spezifisch machen?
template <bool switchable = false, bool counting = false>
struct SimpleBarrier {
private:
std::mutex mtx;
std::condition_variable cv;
std::atomic<bool> enabled;
std::atomic<int> inside;
public:
SimpleBarrier() {
if (switchable) enabled.store(true, std::memory_order_release);
if (counting) inside.store(0, std::memory_order_release);
}
void enter() {
if (switchable && !enabled.load(std::memory_order_acquire)) return;
if (counting) inside.fetch_add(1, std::memory_order_acq_rel);
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock);
}
void leave() {
if (counting) inside.fetch_sub(1, std::memory_order_acq_rel);
}
void release() {
cv.notify_all();
}
void enable() {
if (switchable) {
enabled.store(true, std::memory_order_release);
}
}
void disable() {
if (switchable) {
enabled.store(false, std::memory_order_release);
}
}
bool is_empty() {
if (counting) return inside.load(std::memory_order_acquire) == 0;
return false;
}
};
Anfangs wie „SwitchableBarrier“ und „CountingSection“ usw. Ich wollte nur ein paar Klassen machen, aber dann begann ich Kombinationen wie „SwitchableCountingSection benötigen "Und es wird wahrscheinlich mehr Qualitäten geben. Um ein Dutzend Klassen zu vermeiden, habe ich sie mithilfe von Template-Parametern in eine Klasse gerollt, um bestimmte Qualitäten ein- und auszuschalten.
Die Verwendung von Vorlagenparametern als Bedingung ermöglicht es dem Compiler, ungenutzte Qualitäten zu optimieren, so dass kein zusätzlicher Aufwand von unbenutzten erzeugt wird. Die Frage ist jedoch - ist es möglich, auch Klassenvariablen zu optimieren?
Nimm die Variable "inside" zum Beispiel, wenn sie == false zählt, dann ist sie völlig nutzlos und muss nicht da sein. Kann ich Template-Parameter-spezifische Klassenvariablen haben?
Definieren Sie eine Template-Spezialisierung für 'counting == false'? – songyuanyao