C++ 如果指向成员函数的指针为空,则对方法进行部分专门化
我有一个带有2个参数的模板类和一个奇特的push_-back方法:C++ 如果指向成员函数的指针为空,则对方法进行部分专门化,c++,templates,member,partial-specialization,C++,Templates,Member,Partial Specialization,我有一个带有2个参数的模板类和一个奇特的push_-back方法: template<class Element, void (Element::*doWhenPushingBack)()> class StorableVector { public: ... void push_back(Handle< Element > e) { this->push_back_< IsNull<st
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;
};
模板
类可存储向量{
公众:
...
无效推回(手柄e){
这->向后推(e);
};
私人:
模板无效推回(手柄e);
模板无效推回(句柄e){m_元素。推回(e);};
模板无效推回(句柄e){((*e)。*(doWhenPushingBack))();m_元素。推回(e);};
std::vector>m_元素;
};
它使用
template <void * param> class IsNull {
public:
enum {value = 0 };
};
template <>
class IsNull<NULL> {
public:
enum {value = 1 };
};
模板类为空{
公众:
枚举{value=0};
};
模板
类为空{
公众:
枚举{值=1};
};
这段代码未编译(错误C2440:“静态\u强制转换”:无法从“void(\uu thiscall pal::InterfaceFunction::*const)(void)”转换为“void*”
1> 没有可以进行此转换的上下文)
在运行时执行(!!doWhenPushingBack)检查工作正常,但看起来有点愚蠢-编译时输入检查需要在编译时进行
你能帮忙吗?
谢谢。你可以写
void push_back(Handle< Element > e) {
this->push_back_< doWhenPushingBack == 0 >(e);
};
void推回(手柄e){
这->向后推(e);
};
无需使用
IsNull
模板。您可以有类似的行为:
class Fred
{
public:
void yabadabadoo() { std::cout << "yabadabadoo" << std::endl; }
void wilma() { std::cout << "Wilmaaaaaaa!" << std::endl; }
};
template <typename E>
struct Nothing
{
void operator()(E const &) const { }
};
template <typename E, void (E::* memfun)()>
struct Something
{
void operator()(E e) const { (e.*memfun)(); }
};
template <typename E, typename Pre = Nothing<E>>
class MyVec
{
public:
void push_back(E e) { Pre()(e); m_vec.push_back(e); }
protected:
private:
std::vector<E> m_vec;
};
void stackoverflow()
{
MyVec<Fred> silent;
MyVec<Fred, Something<Fred, &Fred::yabadabadoo>> yab;
MyVec<Fred, Something<Fred, &Fred::wilma>> wil;
Fred fred;
silent.push_back(fred);
yab.push_back(fred);
wil.push_back(fred);
}
class
{
公众:
void yabadabadoo(){std::cout错误说明了一切:您无法将函数指针转换为对象指针。那么..为什么不简单地doWhenPushingBack!=0
和bool
模板参数呢?我知道。是否还有其他方法可以进行编译时检查(第二个参数==NULL)?@Xeo-“!=0”也是一个运行时检查,您不能在编译时执行!!doWhenPushingBack
测试吗?它看起来像一个常量表达式。