名前空間
変種
操作

std::ios_base::register_callback

提供: cppreference.com
< cpp‎ | io‎ | ios base
 
 
 
 
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 <iostream>
#include <locale>
#include <functional>
 
// 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