Namensräume
Varianten
Aktionen

std::ios_base::register_callback

Von cppreference.com
< cpp‎ | io‎ | ios base
 
 
 
 
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