[英]Using function pointers in template class c++
我正在使用解析数据的模板类。 每一行数据都需要调用两个函数之一来处理数据。 该决定是在构造解析器时确定的,并且取决于传递给构造函数的变量。 我认为使用函数指针对此很有用,这样我就可以在构造函数中使用一个if语句,并将适当的函数分配给将在程序主体中使用的函数指针。 我收到了一个我无法弄清的错误,我很好奇在这种情况下是否正确使用了函数指针。
template<class T1, class T2>
class MyClass{
protected:
void (*pDoSomething)(std::string,std::string,std::string);
void functionOne(std::string,std::string,std::string);
void functionTwo(std::string,std::string,std::string);
public:
MyClass(bool option);
void parseData();
};
templace<class T1, class T2>
MyClass<T1,T2,>::MyClass(bool option){
if (option) pDoSomething = &functionOne;
else pDoSomething = &functionTwo;
}
template<class T1, class T2>
void MyClass<T1,T2>::parseData(){
/* . . . */
while(dataToParse){
*pDoSomething(string1, string2, string3);
}
/* . . . */
}
像这样更改它:
template<class T1, class T2>
class MyClass
{
typedef void (MyClass::*ptmf)(std::string, std::string, std::string);
ptmf the_function;
explicit MyClass(bool b)
: the_function(b ? &MyClass::functionOne : &MyClass::functionTwo)
{ }
void parse_data()
{
(this->*the_function)(s1, s2, s3);
}
// ...
};
该错误很可能是由于使用函数指针指向成员函数而引起的。 类中的函数与普通函数之间存在相当大的差异。 您正在将类函数分配给普通函数指针。 当您考虑到所有成员函数都将一个隐藏的this
指针作为其第一个参数时,就会出现区别。
可以将函数更改为不在类之外(或者,如果函数不需要类的任何变量,基数或this
指针,则可以使用静态函数),也可以将函数指针更改为类成员函数指针。 指向需要字符串的MyClass函数的指针将如下所示。
void (MyClass::*fptr)(std::string str);
因为类函数指针需要隐藏this
指针,所以函数指针的调用也会更改。 要调用fptr指向的函数,可以使用->*
或.*
c ++运算符。 因此,可以使用MyClass的this
指针来调用它:
std::string aString;
(this->*fptr)(aString);
我不确定,但是也许可以用虚拟函数来做您希望做的事情? 这可以通过具有两个单独的类和两个实例之一的指针来实现。 这两个类均源自具有纯虚函数的类,该虚函数与您在此处分配的函数相同。 与使用函数指针相比,这是一种更干净的解决方案。 我将对此进行研究,因为如果您使用函数指针查找动态行为,您可能会发现它很有用。
这是一个很好的关于函数指针基础的教程:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.