#include <iostream>
template <class T>
class B
{
public:
B()
{
std::cout << "Constructing with default ctor\n";
}
B(int)
{
std::cout << "Initializing with int param\n";
}
B(double)
{
std::cout << "Initializing with double param\n";
}
};
template <class T>
class A
{
public:
static const B<T> member;
};
// for an int
template<>
const B<int> A<int>::member(3);
// for a double
template<>
const B<double> A<double>::member(50.3);
// use no-arg constructur with A<void>
template<>
const B<void> A<void>::member{}; // = B<void>();
int main(int argc, char* argv[])
{
// (printing so I don't get a warning, which will be treated as an error)
std::cout << &A<int>::member;
std::cout << &A<double>::member;
std::cout << &A<void>::member;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIEIKewpwdWJsaWM6CiAgICAKICAgIEIoKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQ29uc3RydWN0aW5nIHdpdGggZGVmYXVsdCBjdG9yXG4iOwogICAgfQogICAgCiAgICBCKGludCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkluaXRpYWxpemluZyB3aXRoIGludCBwYXJhbVxuIjsKICAgIH0KICAgIAogICAgQihkb3VibGUpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJJbml0aWFsaXppbmcgd2l0aCBkb3VibGUgcGFyYW1cbiI7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgQQp7CnB1YmxpYzoKCQogICAgc3RhdGljIGNvbnN0IEI8VD4gbWVtYmVyOwp9OwoKLy8gZm9yIGFuIGludAp0ZW1wbGF0ZTw+CmNvbnN0IEI8aW50PiBBPGludD46Om1lbWJlcigzKTsKCi8vIGZvciBhIGRvdWJsZQp0ZW1wbGF0ZTw+CmNvbnN0IEI8ZG91YmxlPiBBPGRvdWJsZT46Om1lbWJlcig1MC4zKTsKCi8vIHVzZSBuby1hcmcgY29uc3RydWN0dXIgd2l0aCBBPHZvaWQ+CnRlbXBsYXRlPD4KY29uc3QgQjx2b2lkPiBBPHZvaWQ+OjptZW1iZXJ7fTsgLy8gPSBCPHZvaWQ+KCk7CgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewogICAgLy8gKHByaW50aW5nIHNvIEkgZG9uJ3QgZ2V0IGEgd2FybmluZywgd2hpY2ggd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yKQogICAgc3RkOjpjb3V0IDw8ICZBPGludD46Om1lbWJlcjsKICAgIHN0ZDo6Y291dCA8PCAmQTxkb3VibGU+OjptZW1iZXI7CiAgICBzdGQ6OmNvdXQgPDwgJkE8dm9pZD46Om1lbWJlcjsKICAgIAogICAgcmV0dXJuIDA7Cn0=