Sie scheinen mit verwirrenden Teil-Spezialisierung zu sein Standardschablonenargumente. Es scheint weiterhin, dass Sie beides brauchen (aus Gründen, die nicht erwähnt werden, aber nicht wirklich wichtig sind). Obwohl nicht ganz intuitiv, es kann wie folgt erreicht werden:
#include <iostream>
template <typename Key, typename Value = bool>
class KeyValuePair
{
public:
KeyValuePair()
{
std::cout << __PRETTY_FUNCTION__ << ':' << "original\n";
}
};
template <typename Key>
class KeyValuePair<Key, bool>
{
public:
KeyValuePair()
{
std::cout << __PRETTY_FUNCTION__ << ':' << "specialized\n";
}
};
int main()
{
KeyValuePair<int,int> kvp1;
KeyValuePair<int> kvp2;
}
Ausgabe
KeyValuePair<int, int>::KeyValuePair() [Key = int, Value = int]:original
KeyValuePair<int, bool>::KeyValuePair() [Key = int, Value = bool]:specialized
Das verwirrende Teil zu einigen ist die Standard-Argument-Spezifikation, sondern eine Vorlage, die folgt, die nie wirklich sehen Erfüllung mit diesem Standard-arg wegen der späteren Spezialisierung. In solchen Fällen bevorzuge ich die Forward-Deklaration der Vorlage mit ihrer Standardargumentliste. Zumindest für mich macht es das Lesen etwas leichter. Sie können sich (oder auch nicht) dazu entschließen, dasselbe zu tun, wenn Sie das Gefühl haben, dass es Klarheit bietet. So etwas wie:
template <typename Key, typename Value = bool>
class KeyValuePair;
template <typename Key, typename Value>
class KeyValuePair
{
public:
KeyValuePair()
{
std::cout << __PRETTY_FUNCTION__ << ':' << "original\n";
}
};
template <typename Key>
class KeyValuePair<Key, bool>
{
public:
KeyValuePair()
{
std::cout << __PRETTY_FUNCTION__ << ':' << "specialized\n";
}
};
Was Sie erwarten 'Value' in' KeyValuePair 'zu sein? –
TartanLlama
@TartanLlama: In 'KeyValuePair' erwarte ich, dass 'Value' 'bool' ist, aber ich habe offensichtlich die Teilspezialisierung nicht richtig definiert, um dies zu tun. –
shrike
@shrike Die teilweise Spezialisierung funktioniert nicht so, wie Sie es erwarten. Sie müssen den Schlüssel- und den Werttyp angeben. Nur wenn der Werttyp bool ist, wird die Implementierung der spezialisierten Klasse ausgewählt, für alle anderen Typen wird die erste Implementierung verwendet. – Arunmu