开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
g++ 4.7.1 with C++11
问题(Question):
程式的目的是想要在建构许多类别"之前"就会做一些固定的事情,假设为印出 show,
因此使用 static member data 达到这个目的:
template<class T>
struct ShowClass
{
ShowClass() { std::cout << "show" << std::endl; }
};
struct Test
{
private:
static ShowClass<Test> our_show;
};
ShowClass<Test> Test::our_show;
因为这种的类别会有很多个,每个都要加 static member data 与初始化很麻烦,
于是想额外定义新的类别,并且继承自它:
template <typename T>
struct AutoShow
{
AutoShow() { &our_show; }
protected:
static ShowClass<T> our_show;
};
template <typename T>
ShowClass<T> AutoShow<T>::our_show;
所以原本的 Test 就会变成
struct TestOK : public AutoShow<TestOK>
{
public:
TestOK() {}
};
成功在 main 开始做事情之前就会印出 show,
但是,如果把 constructor 拿掉让它是默认值产生的话,就没办法印出,
struct TestFail : public AutoShow<TestFail>
{
};
TestFail 没办法印出 show。
请问这是什么原因导致会有这种现象?
必须手动替每个类别加上 constructor 才行吗?
程式码(Code):(请善用置底文网页, 记得排版)
http://ideone.com/VSRNbz
为了清楚辨认出印出 show 的类别,
范例使用 template_to_string 与宏 DEFINE_TYPE,
将 template type 转成 string 并印出。
执行结果:
Test show
TestOK show
预期结果:
Test show
TestOK show
TestFail show
补充说明
在 main 建构出 TestFail 的话是会印出 show,
但是我想要的效果是不必建构出 TestFail 实体就能印出 show。