Czy istnieje sposób na wdrożenie ciągów do pracy zarówno w czasie kompilacji, jak i czasu wykonywania?C++ 11 implementacja ciągów constexpr
AFAIK dla klasy, która ma być skonstruowana przez constexpr, musi mieć trywialny destruktor. Jednak okazuje się to trudne, gdy mamy do czynienia z łańcuchami. Jeśli ciąg NIE jest constexpr, to musi zwolnić pamięć. Jednak jeśli jest to IS constexpr, to jest statycznie przydzielane i nie powinno być usuwane, umożliwiając w ten sposób trywialny destruktor.
Nie można jednak powiedzieć "Hej, Kompilatorze! Jeśli jestem constexpr, nie musisz mnie niszczyć!" Albo to jest?
To byłoby coś jak poniżej:
class string {
private:
char * str;
public:
template<std::size_t l>
constexpr string(const char (&s)[l]) : str(&(s[0])) {}
string(const char * s) { str = strdup(s); }
static if (object_is_constexpr) {
~string() = default;
}
else {
~string() { free(str); }
}
};
Najbliżej byłem w stanie przyjść jest posiadanie dwóch odrębnych typów, łańcuch i constexpr_string, zdefiniowana przez użytkownika dosłowne _string powracającego constexpr_string, a użytkownik -definiowana niejawna konwersja z constexpr_string na string.
To niezbyt miłe, ponieważ const auto s = "asdf"_string;
działa, ale nie działa pod . Dodatkowo referencja/wskaźnik do constexpr_string nie będzie konwertować. Dziedziczenie w obu kierunkach powoduje nieintuicyjną "gotcha" i nie rozwiązuje pierwszego problemu.
Wygląda na to, że powinno być możliwe, o ile kompilator miałby ZAUFAĆ programistce, że constexpr nie musiał być niszczony.
Jeśli mam nieporozumienie, daj mi znać.
Myślę, że szukasz 'strwrap' z http://akrzemi1.wordpress.com/2011/05/11/parsing-strings-at-compile-time-part-i/ – Cubbi
Literały ciągów znaków' const char (& Var) [N] '_to_ typ łańcucha' constexpr'. –
Musisz pokochać, gdy ludzie zaczną używać funkcji takich jak 'static if', zanim zostaną zatwierdzeni! –