У меня есть два тестовых примера класса, имеющего экземпляр статического члена. В первом используются образцы без шаблонов, а во втором используются общие типы объектов.
Дилемма проста: конструктор статического члена вызывается перед основной функцией (как и должно быть), но только для определенных типов объектов. Универсальные типы не демонстрируют такого же поведения. На самом деле конструктор вообще не компилируется. Кажется, компилятор решил совсем проигнорировать его как средство (не совсем оправданное) оптимизации.
Я хотел бы знать, что происходит и что можно сделать, чтобы это работало максимально элегантно. Я предполагаю, что очевидным ответом будет: используйте этот статический член где-нибудь в коде. Я бы не хотел этого делать, поскольку случай конкретного типа работает без использования этого статического члена, кроме выполнения некоторой «работы» в его конструкторе.
Примеры кода:
//////////////////////////////////////////////
// Specific case
//////////////////////////////////////////////
class CPassive
{
public:
CPassive()
{
printf(" passively called ");
}
};
class CActive
{
private:
static CPassive ms_passive;
};
CPassive CActive::ms_passive;
///////////////////////////////////////////////////////////
// GENERIC TYPES
///////////////////////////////////////////////////////////
class CSample
{
public:
CSample()
{
printf("sample ");
}
};
template <typename T>
class CGenericPassive
{
public:
CGenericPassive()
{
T sample;
printf(" generic passive .. ");
}
private:
};
template <typename T>
class CGenericActive
{
private:
static CGenericPassive<T> ms_passive;
};
template<typename T>
CGenericPassive<T> CGenericActive<T>::ms_passive;
int main(int argc, char** argv)
{
CActive activeExample;// instantiates the static member
CGenericActive<CSample> activeExample; // obliterates the static from the class def.
}
CGenericPassive<int> CGenericActive<int>::ms_passive;
иCGenericPassive<char***> CGenericActive<char***>::ms_passive;
И что вы подразумеваете под удалением статики из класса? - person m24p   schedule 20.02.2014(void)ms_passive
из этого конструктора, и вы увидите, что конструкторCGenericPassive
вообще не будет вызываться, тогда как того же самого не произойдет, если используются нешаблонные члены. Я очень устал, когда писал лексическую единицу экземпляра члена. Имейте в виду, я не единственный, кто злоупотребляет выражением: publib.boulder.ibm.com/infocenter/comphelp/v8v101/ . - person teodron   schedule 21.02.2014