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

时间:2013-04-22 20:01:06

标签: c++ templates c++11 function-pointers

我正在使用一个解析数据的模板类。每行数据都需要调用两个函数之一来处理数据。此决定是在构造解析器时确定的,并且取决于传递给构造函数的变量。我认为为此使用函数指针是有用的,这样我就可以在构造函数中使用一个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);
    }
    /* . . . */
}

2 个答案:

答案 0 :(得分:3)

像这样改变:

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);
    }

    // ...
};

答案 1 :(得分:2)

错误最有可能是使用函数指针指向成员函数。类中的函数与正常函数之间存在相当大的差异。您正在为正常的函数指针分配一个类函数。当您考虑所有成员函数将隐藏的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/