gpt4 book ai didi

c++ - 使用函数指针调用函数模板

转载 作者:行者123 更新时间:2023-11-28 02:21:51 26 4
gpt4 key购买 nike

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

例如:

文件: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));
}
}

我不确定这是正确的做法。但是控制台上没有打印任何结果。

最佳答案

编译代码时遇到的错误告诉您哪里出了问题:

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,则可以尝试使用 lambda:

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

但无论您如何分割它,您都需要更改参数或使用一个小函数将参数从一种形式转换为另一种形式。

关于c++ - 使用函数指针调用函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32131222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com