2016-05-21 3 views
1

Учитывая следующий шаблон шаблона, есть ли способ, чтобы поле a было одинаковым во всех специализациях (то есть A<int>::a - это такое же значение, что и A<std::string>::a)?Статический член, разделяемый специалистами шаблонов

template<class T> 
class A final { 
private: 
    static int a; 
}; 
+0

Missing ';' в конце объявление класса. – user2296177

+0

@ пользователь2296177 спасибо, исправлено. –

+4

Да, просто наследуйте от не templated базового класса, который будет хранить статический член. – syntagma

ответ

4

Просто наследует (конфиденциально) от нешаблонного и переместить static там:

class ABase { 
protected: 
    static int a; 
}; 

int ABase::a; 

template<class T> 
class A final : private ABase 
{ }; 
+0

Единственная проблема, которую я вижу с этим, - это то, что любой может наследовать от 'ABase ', есть ли способ предотвратить это? –

+0

Не 'окончательный' избыточный здесь? – syntagma

+0

@ Николас Да, но стоит ли это усилий? Просто спрячьте базу где-нибудь. – Barry

1

Спасибо тем, кто предложил не-шаблонный базовый класс. Аналогичное решение, которое я нашел, что снимает вопрос о АНИ потребителя наследуемыхов от базового класса, чтобы иметь его в качестве последнего класса с шаблонным классом, объявленным как друг:

class A_Data final { 
private: 
    static int a; 

    template<class T> 
    friend class A; 
}; 

template<class T> 
class A final { 
}; 
Смежные вопросы