私はEffective C++を読んでいるので、複数のオブジェクトの構築を防ぐクラスを実装しようとしました(項目4):
#include <iostream>
using namespace std;
class testType
{
public:
testType()
{
std::cout << "TestType Ctor called." << std::endl;
}
};
template <typename T, class C>
class boolWrapper
{
public:
boolWrapper()
// Shouldn't T() be called here in the initialization list, before the
// body of the boolWrapper?
{
if (C::exists)
{
std::cout << "Oh, it exists." << endl;
}
else
{
std::cout << "Hey, it doesn't exist." << endl;
C::exists = true;
T();
}
}
};
template<class T>
class singleton
{
private:
static bool exists;
boolWrapper<T, singleton> data_;
public:
singleton()
:
data_()
{
};
friend class boolWrapper<T, singleton>;
};
template <class T>
bool singleton<T>::exists = false;
int main(int argc, const char *argv[])
{
singleton<testType> s;
singleton<testType> q;
singleton<testType> r;
return 0;
}
boolWrapper の T() 構造が boolWrapper コンストラクターの本体の前に呼び出されないのはなぜですか? boolWrapper には T 型のデータ メンバーがなく、T から継承されない (親 ctor が暗黙的に呼び出されない) ためですか?
また、解決策をグーグルで検索せずにこれをコーディングしましたが、設計上のエラーはありましたか?