以下是否会导致明确的行为?也就是说,如果您将非可变参数函数f作为可变参数函数g并使用f期望的参数调用g,那么行为是否与使用这些参数调用f的行为相匹配?C++可变参数函数指针
class Base {};
class Derived1 : public Base {
public:
int getInt1() {return 1;}
};
class Derived2 : public Base {
public:
int getInt2() {return 2;}
};
typedef int (*vfunc)(...);
int foo (vfunc f) {
Derived1 d1;
Derived2 d2;
return f(&d1, &d2);
}
int bar (Derived1 * p1, Derived2 * p2) {
return p1->getInt1() + p2->getInt2();
}
int main (int argc, char ** argv) {
return foo((vfunc)bar); // Is this program guaranteed to return 3?
}
UPDATE
有一些办法可以让程序得到很好的界定,即使使用专有的关键字?比如做喜欢这里提到的__cdecl
一些东西:
http://msdn.microsoft.com/en-us/library/984x0h58%28v=vs.80%29.aspx
我的最终目标是拥有一个matcher
功能,试图X指针的列表匹配。匹配器函数接受一个谓词(不一定是一个函数...可能是一个列表),并接受一个函数,它会将匹配的结果传递给它。传递给它的回调函数采用与谓词匹配相同的参数类型和参数。
我相信并期待答案是这是未定义的行为。 –
当你说“专有关键字”时,你是什么意思?您定位的是什么编译器(以及版本和设置)?你打开其他更好的解决方案(如'std :: function')吗? –
像Visual Studio中的__cdecl一样的东西。我也开放其他解决方案。 –