Вам не нужно специализировать функцию.Вы можете просто сделать это:
template<typename T>
X& XT()
{
static X x;
return x;
}
И использовать его как:
X &xa = XT<A>();
X &xb = XT<B>();
X &xc = XT<C>();
X &xd = XT<A>(); //xd is same as xa
Все три объекта xa
, xb
и xc
являются различными экземплярами X. Однако, xa
и xd
являются одинаковыми экземплярами, так как они оба вызывают одну и ту же функцию.
Здесь необходимо отметить, что компилятор создает разные функции для каждого другого аргумента шаблона.Так что XT<A>()
- это функция, отличная от XT<B>()
, и каждая функция имеет свои собственные static
локальные переменные.Таким образом, локальная переменная static
в XT<A>()
является экземпляром, отличным от переменной в XT<B>()
.