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 Bdass 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?
AundB? Ich verstehe nicht, warum es nicht so wäre.