使用函数指针调用函数模板

时间:2015-08-21 02:00:19

标签: c++ templates struct function-pointers

我需要使用函数模板,该函数模板通过函数指针在头文件中提供,该函数指针可用作结构成员。

例如:

文件:mytemplate.h

template<typename T> const bool GT(const T& pa_roIN1, const T& pa_roIN2)
{
    bool temp = false;
    if(pa_roIN1 > pa_roIN2){
        temp = true;
    }
    return temp;
}

template<typename T> const bool EQ(const T& pa_roIN1, const T& pa_roIN2)
{
    bool temp = false;
    if(pa_roIN1 == pa_roIN2){
      temp = true;
    }
    return temp;
}

template<typename T> const bool GE(const T& pa_roIN1, const T& pa_roIN2)
{
    bool temp = false;
    if(pa_roIN1 >= pa_roIN2){
      temp = true;
    }
    return temp;
 }

文件:mystruct.h:

struct mystruct {
    std::string  funcName;
    bool (*funcPtr)(int,int);
};

typedef std::map<int, mystruct> mystructList;

文件:mycpp.cpp:

#include "mytemplate.h"
#include "mystruct.h"

mystruct MyGreaterStruct[3] = {
  {"GREATER_THAN", &GT},
  { "EQUAL", &EQ},
  { "GREATER_N_EQUAL", &GE}
};

mystructList MyList;
int main(void)
{
     int size = sizeof(MyGreaterStruct)/sizeof(mystruct);
     for(int i = 0; i < size; i++) {
       MyList.insert(std::pair<int, mystruct>(i,MyGreaterStruct[i])); }

     for(mystructList::iterator iter = MyList.begin(); iter != MyList.end(); iter++) {
        printf("\nResult of func : %s for values 100,50 : %d",iter->second.funcName.c_Str(),iter->second->funcPtr(100,50));
     }
}

我不确定这是否正确。但是没有结果可以在控制台上打印出来。

1 个答案:

答案 0 :(得分:2)

编译代码时出现的错误告诉您错误:

mycpp.cpp:8:1: error: no matches converting function ‘GT’ to type ‘bool (*)(int, int)’
 };
 ^
mytemplate.h:1:33: note: candidate is: template<class T> const bool GT(const T&, const T&)
 template<typename T> const bool GT(const T& pa_roIN1, const T& pa_roIN2)
                                 ^

没有办法实例化该模板以匹配函数指针的签名,因为模板将两个引用作为参数,而指针需要两个整数。如果您无法更改结构或模板,并且您使用的是C ++ 11,则可以尝试使用lambdas:

mystruct MyGreaterStruct[3] = {
  {"GREATER_THAN", [](int a, int b)->bool { return GT(a, b); } },
  { "EQUAL", [](int a, int b)->bool { return EQ(a, b); } },
  { "GREATER_N_EQUAL", [](int a, int b)->bool { return GE(a, b); } }
};

但无论你如何切片,你都需要更改参数或使用一个将参数从一种形式转换为另一种形式的函数。