Force explicit template instantiation with CRTP
c++, c++11, crtp, templates
Solution
You could pass the variable as a reference template argument. Then the object is needed which causes an instantiation
template <typename T, T /*unnamed*/>
struct NonTypeParameter { };
template <typename T>
class InitCRTP
{
public:
static InitHelper init;
typedef NonTypeParameter<InitHelper&, init> object_user_dummy;
};
Problem
I am trying to use a CRTPed base to hold some static initialization code like this: ``` template <typename T> class InitCRTP { public: static InitHelper<T> init; }; template <typename T> InitHelper<T> InitCRTP<T>::init; ``` Now, any class which needs to do the work in `InitHelper<T>` can do this: ``` class WantInit : public InitCRTP<WantInit> { public: void dummy(){init;}//To force instantiation of init }; template class InitCRTP<WantInit>;//Forcing instantiation of init through explicit instantiation of `InitCRTP<WantInit>`. ``` To force instantiation of `InitCRTP<WantInit>::init`, I can either use `dummy` or use the explicit instantiation as shown above. Is there a way of getting around this with doing neither? I would like users of this pattern to be able to simply inherit from `InitCRTP<WantInit>` and not worry about anything else. If it helps, using `C++11` is not an issue.