std::ios_base::register_callback
来自 cppreference.com
void register_callback( event_callback function, int index ); |
||
注册一个用户定义的函数,该函数将由 imbue()、std::basic_ios::copyfmt() 和 ~ios_base() 调用。每次调用注册的回调函数时,事件类型(event 类型的值)将作为第一个参数传递,可用于区分调用者。
回调函数以注册的相反顺序调用(换句话说,register_callback()
在回调堆栈上推送回调对)。如果从回调函数内部调用 register_callback()
以添加新的回调函数,则新回调函数只在下次事件发生时被调用。
用户定义的回调函数不允许抛出异常。
内容 |
[编辑] 参数
function | - | 将在事件发生时调用的函数,以 event_callback 类型函数指针的形式提供 |
index | - | 将传递给函数的自定义参数 |
[编辑] 返回值
(无)
[编辑] 备注
一旦注册,回调函数就不能注销:它在流对象的生命周期内一直存在。如果需要更改回调函数的行为,可以通过 iword() 或 pword() 控制。
如果同一个函数注册多次,它将被调用多次。
与回调函数一起存储的整数值通常是从 xalloc() 获取的索引。
[编辑] 示例
演示如何使用 register_callback
更新自定义输出操作符使用的依赖于区域设置的缓存值。
运行这段代码
#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'; }
输出
Memory exhausted : 2,295,079,096 Speicher erschöpft : 3,139,423,551 メモリーが足りません : 3,837,351,114 Память исчерпана : 3,742,732,851