std::ios_base::register_callback
| void register_callback( event_callback function, int index ); |
||
Registriert eine benutzerdefinierte Funktion, die von imbue(), std::basic_ios::copyfmt() und ~ios_base() aufgerufen wird. Jeder registrierte Callback wird jedes Mal aufgerufen: Der Ereignistyp (ein Wert vom Typ event) wird als erstes Argument übergeben und kann verwendet werden, um zwischen den Aufrufern zu unterscheiden.
Die Callbacks werden in umgekehrter Registrierungsreihenfolge aufgerufen (mit anderen Worten, register_callback() legt ein Callback-Paar auf den Callback-Stack). Wenn register_callback() aus einer Callback-Funktion heraus aufgerufen wird, um einen neuen Callback hinzuzufügen, wird der neue Callback erst beim nächsten Ereignis aufgerufen.
Der benutzerdefinierte Callback darf keine Ausnahmen auslösen.
Inhalt |
[bearbeiten] Parameter
| Funktion | - | die Funktion, die bei einem Ereignis aufgerufen wird, übergeben als Funktionszeiger vom Typ event_callback |
| index | - | benutzerdefinierter Parameter, der an die Funktion übergeben wird |
[bearbeiten] Rückgabewert
(keine)
[bearbeiten] Hinweise
Einmal registriert, kann ein Callback nicht mehr abgemeldet werden: Er bleibt für den Rest seiner Lebensdauer Teil des Stream-Objekts. Wenn sich das Verhalten eines Callbacks ändern soll, kann dies über iword() oder pword() gesteuert werden.
Wenn dieselbe Funktion mehrmals registriert wird, wird sie mehrmals aufgerufen.
Der mit dem Callback gespeicherte ganzzahlige Wert ist typischerweise ein Index, der von xalloc() bezogen wurde.
[bearbeiten] Beispiel
Demonstriert die Verwendung von register_callback, um lokalabhängige zwischengespeicherte Werte zu aktualisieren, die von einem benutzerdefinierten Ausgabeoperator verwendet werden.
#include <functional> #include <iostream> #include <locale> // Cached locale-specific message and its hash typedef std::pair<std::string, std::size_t> cache_t; // Populate the cached message and its hash from the locale void update_cache(cache_t& cache, std::locale loc) { auto& fct = std::use_facet< std::messages<char> >(loc); std::messages_base::catalog cat = fct.open("sed", loc); cache.first = cat < 0 ? "" : fct.get(cat, 0, 0, "Memory exhausted"); cache.second = std::hash<std::string>()(cache.first); } // Update the cache if the locale changed void true_callback(std::ios_base::event evt, std::ios_base& str, int idx) { if (evt == std::ios_base::imbue_event) { cache_t* ptr = static_cast<cache_t*>(str.pword(idx)); update_cache(*ptr, str.getloc()); } } // Registers the cache in pword() and sets up the callback struct CacheSetup { CacheSetup(std::ostream& os, std::ios_base::event_callback f, cache_t* cache) { int index = std::ostream::xalloc(); os.pword(index) = cache; // Store pointer to cache in the stream os.register_callback(f, index); // Store callback and the index to the pointer update_cache(*cache, os.getloc()); // Initialize cache }; }; // Some custom class struct S {}; // Some custom class's operator<< that needs fast access to hashed message std::ostream& operator<<(std::ostream& os, const S&) { static cache_t cache; static CacheSetup setup(os, true_callback, &cache); return os << cache.first << " : " << cache.second; } int main() { std::locale loc("en_US.utf8"); S s; std::cout.imbue(loc); std::cout << s << '\n'; std::cout.imbue(std::locale(loc, new std::messages_byname<char>("de_DE.utf8"))); std::cout << s << '\n'; std::cout.imbue(std::locale(loc, new std::messages_byname<char>("ja_JP.utf8"))); std::cout << s << '\n'; std::cout.imbue(std::locale(loc, new std::messages_byname<char>("ru_RU.utf8"))); std::cout << s << '\n'; }
Ausgabe
Memory exhausted : 2,295,079,096 Speicher erschöpft : 3,139,423,551 メモリーが足りません : 3,837,351,114 Память исчерпана : 3,742,732,851