I have got a template class with 2 parameters and a fancy push_back method:
template<class Element, void (Element::*doWhenPushingBack)()>
class StorableVector {
public:
...
void push_back(Handle< Element > e) {
this->push_back_< IsNull<static_cast<void *>(doWhenPushingBack)>::value >(e);
};
private:
template <int action> void push_back_(Handle< Element > e);
template<> void push_back_<0>(Handle< Element > e) { m_elements.push_back(e); };
template<> void push_back_<1>(Handle< Element > e) { ((*e).*(doWhenPushingBack))(); m_elements.push_back(e); };
std::vector< Handle< Element > > m_elements;
};
It uses
template <void * param> class IsNull {
public:
enum {value = 0 };
};
template <>
class IsNull<NULL> {
public:
enum {value = 1 };
};
This piece of code does not compile( error C2440: 'static_cast' : cannot convert from 'void (__thiscall pal::InterfaceFunction::* const )(void)' to 'void *' 1> There is no context in which this conversion is possible).
Doing (!!doWhenPushingBack) check on runtime works fine, but looks a bit silly - check of compile time input needs to happen at compile time.
Could you help? Thanks.