Ich habe vor kurzem angefangen, mit Vorlage Metaprogrammierung in C++ zu spielen, und versucht, die Länge einer C-Stil-Zeichenfolge zu bewerten.Hatte obere Grenze während der Bewertung der Länge der C-Stil-Zeichenfolge durch Vorlage Metaprogrammierung
Ich habe einige Erfolge mit diesem Stück Code jedoch
template <const char *str, std::size_t index>
class str_length {
public:
static inline std::size_t val() {
return (str[index] != '\0') ? (1 + str_length<str, index + 1>::val()) : 0;
}
};
template <const char *str>
class str_length <str, 500> {
public:
static inline std::size_t val() {
return 0;
}
};
extern const char bitarr[] { "0000000000000000000" };
int main() {
std::cout << str_length<bitarr, 0>::val() << std::endl;
getchar();
return 0;
}
hatte, musste ich durch die Schaffung einer Spezialisierung der str_length eine „Obergrenze“ von 500 einzustellen. Wenn ich das ausschließe, würde dies dazu führen, dass mein Compiler auf unbestimmte Zeit läuft (vermutlich mit unendlichen Spezialisierungen von str_length).
Gibt es etwas, was ich tun könnte, um den Index = 500 zu begrenzen? Ich verwende VC++ 2015, wenn das hilft.
Oh, und ich verwende nicht constexpr, weil VC++ die C++ 14 erweiterten conexpr Funktionen noch nicht ganz unterstützt. (https://msdn.microsoft.com/en-us/library/hh567368.aspx#cpp14table)
Warum verwenden Sie nicht die Tatsache, dass 'bitarr' ein * Array * ist und daher bereits eine Größe für die Kompilierung hat? –
Wie gesagt, nur mit TMP rumspielen. – lennoxho