trivial_singleton

  • にこっそりある
  • 無名名前空間の参照を使っている
    • アクセスのオーバーヘッドは翻訳単位ごとに一回きりである
    • このオブジェクトに関する限り、初期化順序の問題は起こらない
    • オブジェクトの初期化はスレッドセーフ
  • 関数呼び出しのシンタックスでもスレッドセーフにする方法が、にある


[]#include[] []<boost/test/minimal.hpp>[]
[]#include[] []<iostream>[]
[]#include[] []<string>[]
[]#include[] []<boost/test/utils/trivial_singleton.hpp>[]

[]// <abc.hpp>[]
[]//[]
[]struct[] []abc_t[][] : [][]// xxx_tという名前でないといけない[]
[]boost[][]::[][]unit_test[][]::[][]singleton[][]<[][]abc_t[][]>[]
[]{[]
[]public[][]:[]
[]void[] []hello[][]()[]
[] {[]
[]std[][]::[][]cout[][] << [][]"hello"[][] << [][]std[][]::[][]endl[][];[]
[] }[]

[]std[][]::[][]string[] []str[][]() [][]const[]
[] {[]
[]return[] []"hello"[][];[]
[] }[]

[]private[][]:[]
[]BOOST_TEST_SINGLETON_CONS[][]([][]abc_t[][]);[]
[]};[]

[]BOOST_TEST_SINGLETON_INST[][]([][]abc[][])[]
[]//[]
[]// </abc.hpp>[]


[]// <X.cpp>[]
[]//[]
[]// #include <abc.hpp>[]
[]//[]
[]struct[] []X[]
[]{[]
[]X[][]()[]
[] {[]
[]// abc.hello(); // これはまずい![]
[]m_hello[][] = [][]abc[][].[][]str[][](); [][]// OK[]
[] };[]

[]void[] []hello[][]()[]
[] {[]
[]std[][]::[][]cout[][] << [][]m_hello[][] << [][]std[][]::[][]endl[][];[]
[] }[]

[]private[][]:[]
[]std[][]::[][]string[] []m_hello[][];[]
[]};[]


[]X[] []global_x[][];[]
[]//[]
[]// </X.cpp>[]


[]void[] []test[][]()[]
[]{[]
[]abc[][].[][]hello[][]();[]
[]global_x[][].[][]hello[][]();[]

[]// abc_t a; // error![]
[]}[]


[]int[] []test_main[][]([][]int[][], [][]char[][]*[])[]
[]{[]
[] ::[][]test[][]();[]
[]return[] []0[][];[]
[]}[]