2012-01-06 43 views
1

请考虑这个例子, 我们如何强制隐式转换函数的第二个参数是指向成员函数的指针。 明确地在函数的参数列表中进行投射并不是我现在想要的功能。 相反,我会喜欢的编译器在某种程度上是这样做它与第一个参数呢?如何强制多态中的隐式转换?

struct Base 
{ 
    virtual ~Base() = 0 {} 
}; 

struct Derived : public Base 
{ 
    void f(){} 
}; 

typedef void(Base::*polymorph)(); 

// how do I force IMPLICIT conversion here: EDIT: (polymorph type work only for polymorph pointer type no conversion) 
void func(Base* arg1, polymorph arg2) // void* arg2, (void*) arg2 etc... dosn't work 
{ 
    polymorph temp = reinterpret_cast<polymorph>(arg2); // to achive this 
} 

int main() 
{ 
    Derived* test = new Derived; 
    // first parameter work but another gives an error 
    func(test, &Derived::f); // BY NOT CHANGING THIS! 
    delete test; 
    return 0; 
} 
+1

我怀疑这是不能做到的。在func中,你知道(静态)你正在处理一个Base对象,并假装任何Base对象都有该方法是不安全的。 - 另外,仅仅因为有指针参与,并不意味着你必须使用'new/delete':'派生测试; func(&test,&Derived :: f);' – visitor 2012-01-06 11:22:38

+0

这个问题还不够清楚。请解释一下。 – 2012-01-06 11:56:14

+0

我希望能够通过一个指向成员方法的指针,该指针用于指向成员参数的函数参数。在我的例子中,函数应该采用“polimorph”类型,但不会。 – codekiddy 2012-01-06 13:09:59

回答

2

干净,因为它得到。下面的代码。但是当“temp”实际被调用时,我不知道谁是“this”指针会被引用。

typedef void(Base::*polymorph)(); 

void func(Base* arg1, polymorph arg2) 
{ 
    polymorph temp = arg2; 
} 


int main() 
{ 
    Derived* test = new Derived; 
    // first parameter work but another gives an error 
    func(test, static_cast<polymorph>(&Derived::f)); 
    delete test; 
    return 0; 
} 
+0

感谢您的努力selbie,但第二个参数正在使用static_cast显式转换,但不是按照我的意图隐式转换。我想在没有铸造操作员的情况下在main函数中做这个。相反,铸造操作员应该使用一些其他的。但这不可能不是吗? – codekiddy 2012-01-10 13:07:53

+0

@codekiddy - 出于同样的原因,您不能隐式地将指向基类的指针转换为指向派生类的指针。除此之外,如何通过“temp”调用Derived :: f可能是安全的?什么对象要调用temp,它的类型是什么?如果答案是“基地的一个实例”,那么假设类型安全就是一个很大的飞跃。让我问一下:“你究竟想干什么?”如果我的团队中的某个人试图通过指向成员函数的方法搞砸了某些东西,我们可能会将更好的设计与界面和虚拟方法结合在一起。 – selbie 2012-01-10 19:40:32

+0

我曾经试过的东西不会因为我放弃而变得更加美丽。谢谢你的时间! – codekiddy 2012-01-10 19:54:56