Nein, im Standard C++ gibt es nichts, was dies ermöglichen würde. Eine Möglichkeit, bereits von @FlorisVelleman in den Kommentaren, ist eine Alias-Vorlage vorstellen:
template <class UnderlyingT1, class StringT = std::string>
using options_defT0 = options<int, UnderlyingT1, StringT>;
Dies hat den Nachteil, dass sie explizit das Standardargument von UnderlyingT0
in der Alias-Definition kopieren, aber als am wenigsten ‚es dupliziert nur an einem Ort.
Eine alternative Option wird von vielen Boost-Bibliotheken verwendet. Sie führen ein spezielles Tag use_default
ein und machen das den Standardwert. Etwas wie folgt aus:
struct use_default {};
template<typename UnderlyingT0 = use_default, typename UnderlyingtT1 = use_default, typename StringT = use_default>
struct options
{
using RealUnderlyingT0 = typename std::conditional<
std::is_same<UnderlyingT0, use_default>::value,
int,
UnderlyingT0
>::type;
using RealUnderlyingT1 = typename std::conditional<
std::is_same<UnderlyingT1, use_default>::value,
long,
UnderlyingT1
>::type;
using RealStringT = typename std::conditional<
std::is_same<StringT, use_default>::value,
std::string,
StringT
>::type;
};
Hier sind die Nachteile sind, dass 1. Sie nicht die Standardargumente, indem man die Template-Deklaration erklären kann, und 2. options<>
und options<int, long, std::string>
sind verschiedene Typen.
Ersteres kann durch gute Dokumentation behoben werden, und letzterem kann wahrscheinlich durch vernünftige Verwendung von Konvertierungsfunktionen und Basisklassen geholfen werden.
'template limited_options = Optionen verwendet;' könnte das tun, was Sie fordern? Ich glaube nicht, dass das Standardschlüsselwort in diesem Beispiel akzeptiert wird (obwohl es sinnvoll wäre). –