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[][];[]
[]}[]