繁体   English   中英

在模板类C ++中使用函数指针

[英]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);

我不确定,但是也许可以用虚拟函数来做您希望做的事情? 这可以通过具有两个单独的类和两个实例之一的指针来实现。 这两个类均源自具有纯虚函数的类,该虚函数与您在此处分配的函数相同。 与使用函数指针相比​​,这是一种更干净的解决方案。 我将对此进行研究,因为如果您使用函数指针查找动态行为,您可能会发现它很有用。

这是一个很好的关于函数指针基础的教程:

http://www.learncpp.com/cpp-tutorial/78-function-pointers/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM