Ich frage mich, wie die when
Spezialisierung funktioniert, wenn es keine Fallbasis für den boost::hana::when<false>
Fall gibt.boost :: hana tag_der Implementierung
boost::hana::tag_of
Umsetzung:
template<bool condition>
struct when; // forward declaration only
template<typename T, typename = void>
struct tag_of;
template<typename T, typename>
struct tag_of : tag_of<T, when<true> >
{};
template<typename T, bool condition>
struct tag_of<T, when<condition> >
{
using type = T;
};
und ein Testbeispiel:
struct my_tag {};
struct my_tag2 {};
namespace boost {
namespace hana {
template<class T>
struct tag_of<T, when<std::is_same<T, int>{}()> >
{
using type = my_tag;
};
template<class T>
struct tag_of<T, when<std::is_same<T, unsigned>{}()> >
{
using type = my_tag2;
};
}
}
int main()
{
using type = boost::hana::tag_of<int>::type;
std::cout << std::is_same<type, my_tag>{} << std::endl;
}
und ich frage mich, warum std::is_same<T, int>{}()
(oder mit ::value
, die gleich ist), ist eine spezialisierte Teil Spezialisierung als std::is_same<T, unsigned>{}()
, und warum, wenn die Bedingung in beiden Fällen falsch ist, ist spezialisierter.
Ich habe viele Metafunktionen und arbeiten mit Spezialisierungen und Parameter-Packs und die Art, aber in diesem Fall gibt es etwas, das ich nicht sehe.
Die Sache ist, dass ich sehe nicht, warum der true
oder false
Wert der when
Vorlage Materie kann, wenn es für den false
Fall keine Default-Implementierung ist.
Es ist unglaublich schön. Vielen Dank. –