Vom Laufzeitfehler zum Compilezeitfehler
-
Ganz naives Problem, aber ich komme auf keine Lösung. Wie kann ich folgenden simplen Code umbauen, dass es beim Compilieren oder spätestens beim Linken schon einen Fehler gibt und nicht erst zur Laufzeit, wenn nicht gilt: 0 < length < 32
Ich meine mal gelesen zu haben, dass es im neuen C++0x Standard ein Compiletime-Assert geben wird, oder verwechsle ich da etwas?
// Generates a random word existing of <length> lowercase letters. template<int length> bool generate_random_word(std::string* word) { assert(word != 0); assert(length > 0 && length < 32); word->clear(); for (int i = 0; i < length; ++i) { word->push_back(generate_random_lowercase_letter()); } return true; }
-
So z.B.
template<int length> void f() { BOOST_STATIC_ASSERT(((length > 0) && (length < 32))); //oder static_assert((length > 0) && (length < 32), "length out of range"); }
-
Im neuen Standard wird es das Schlüsselwort
static_assertgeben. Du kannst dir so etwas aber auch ganz leicht selber bauen, falls du kein C++0x hast:template <bool T> class static_assert; template<> class static_assert<true>{}; // ... static_assert<(length > 0 && length < 32)>();Oder um dem noch etwas Syntaxzucker zu verpassen, ausnahmsweise mal ein Makro:
#define STATIC_ASSERT(x) static_assert<(x)>() // ... STATIC_ASSERT(length > 0 && length < 32);edi: 29 Sekunden zu spät. Immerhin zeigt mein Beitrag wie man so etwas selber machen kann. A propos, @Threadersteller: Hast du verstanden, wie mein static_assert funktioniert? Das ist ein grundlegendes Konstrukt in der Templatemetaprogrammierung.
-
Elegante Lösung, sehr schön!
Danke und Gruss,
T.