私は2つのパラメータと派手なpush_backメソッドを持つテンプレートクラスを持っています:
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;
};
それは使用しています
template <void * param> class IsNull {
public:
enum {value = 0 };
};
template <>
class IsNull<NULL> {
public:
enum {value = 1 };
};
このコードはコンパイルされません ( エラー C2440: 'static_cast' : cannot convert from 'void (__thiscall pal::InterfaceFunction::* const )(void)' to 'void *' 1> この変換が行われるコンテキストはありません可能です)。
実行時に (!!doWhenPushingBack) チェックを実行すると問題なく動作しますが、少しばかげているように見えます。コンパイル時に入力をチェックする必要があります。
手伝ってくれる?ありがとう。