我有一个带有 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' : 无法从 'void (__thiscall pal::InterfaceFunction::* const )(void)' 转换为 'void *' 1> 没有进行此转换的上下文是可能的)。
在运行时执行 (!!doWhenPushingBack) 检查工作正常,但看起来有点傻 - 编译时输入的检查需要在编译时进行。
你能帮忙吗?谢谢。