Angenommen, ich habe eine Vorlagenfunktion:
template <typename A, typename B>
A fancy_cast(B)
{
return {};
}
Die beabsichtigte Verwendung ist so etwas wie fancy_cast<int>(1.f)
.
Nichts hindert den Benutzer jedoch daran, den zweiten Vorlagenparameter manuell anzugeben: Dies fancy_cast<int, int>(1.f)
würde Probleme verursachen.
Wie kann ich verhindern, typename B
dass etwas angegeben wird, und erzwingen, dass es abgeleitet wird?
Ich habe mir Folgendes ausgedacht:
// Using this wrapper prevents the code from being
// ill-formed NDR due to [temp.res]/8.3
template <auto V> inline constexpr auto constant_value = V;
template <
typename A,
typename ...Dummy,
typename B,
typename = std::enable_if_t<constant_value<sizeof...(Dummy)> == 0>
>
A fancy_cast(B)
{
return {};
}
Es scheint zu funktionieren, ist aber äußerst umständlich. Gibt es einen besseren Weg?
A
undB
? Ich verstehe nicht, warum es nicht so wäre.protected
,require_deduction...
muss nicht leer sein (im Gegensatz zuenable_if_t<sizeof...(Ts) == 0>
). Die Vorlage ist ungültig, da Sie einige Werte nicht erstellen können. Ebensostruct S{}; using member_ptr_t = void (S::*)();
gilt, auch wennS
keine Mitglieder hat.member_ptr_t
kann mit initialisiert werdennullptr
, aber wenn es nicht könnte, würde ich sagen, dass Sie kein Parameterpaket daraus machen könnten.