如何通过函数指针并在C 中的函数中进行比较
How can you pass a function pointer and compare it in a function in C++?
出于测试原因,我有一定数量的方法,在C 中的签名看起来像:
dvec3 (*)(dvec3, dvec3, double)
我将它们放在向量中,如下所示:
vector<dvec3 (*)(dvec3, dvec3, double)> methods = {lerp, plerp, splerp, ilerp};
这个想法是制作一个函数,以获取功能指针并返回字符串以识别当前正在使用的功能(即我想打印出上述4个功能(
为此,我试图按以下方式编写该方法(我故意使用大多数情况(:
string inline erpToString(dvec3 (*f)(dvec3, dvec3, double))
{
if (f==lerp)
{
return "Lerp";
}
}
上面没有编译,错误消息指出这是铸造错误。我做错了什么?
编辑:
编译器消息:
/home/kronos/Desktop/OpenGL-Template/source/Rendering/rendering.cpp: In function ‘std::__cxx11::string erpToString(glm::dvec3* (*)(glm::dvec3, glm::dvec3, double))’:
/home/kronos/Desktop/OpenGL-Template/source/Rendering/rendering.cpp:1362:7: error: invalid operands of types ‘glm::dvec3* (*)(glm::dvec3, glm::dvec3, double) {aka glm::tvec3<double, (glm::precision)0>* (*)(glm::tvec3<double, (glm::precision)0>, glm::tvec3<double, (glm::precision)0>, double)}’ and ‘<unresolved overloaded function type>’ to binary ‘operator==’
if (f==lerp)
~^~~~~~
make[2]: *** [CMakeFiles/voxel-world.dir/build.make:111: CMakeFiles/voxel-world.dir/source/Rendering/rendering.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/voxel-world.dir/all] Error 2
编辑:
我已经制作了具有相同逻辑的最小文件,但是它不会重现错误:
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <string>
using namespace std;
using namespace glm;
dvec3 lerp(dvec3 p1, dvec3 p2, double t)
{
return (1-t)*p1+t*p2;
}
string inline erpToString(dvec3 (*f)(dvec3, dvec3, double))
{
if (f==lerp)
{
return "Lerp";
}
}
int main()
{
}
播放代码显示其他方法(ILERP和公司(确实有效。因此,我似乎有一个名称空间冲突(使用名称空间(。由于GLM定义了LERP函数,但是我需要使用的功能是我定义的功能。有人提出了建议吗?
您可以使用using
或typedef
简化所有内容。代码适合我
int a(float x, float y, double z)
{
return int(x + y + z);
}
int b(float x, float y, double z)
{
return int(x - y - z);
}
using fdef = int(*)(float, float, double); // or typedef int (*fdef)(float, float, double);
std::vector<fdef> v{a, b};
if (v[0] == a)
std::cout << "qqqn";
密钥是 ‘<unresolved overloaded function type>’
特别是您有两个lerp
功能。通常允许。在大多数情况下,C 会找出您想要的。例如,当您调用lerp(arg1,arg2, arg3)
时,C 将使用这三个参数进行过载分辨率。但是在f==lerp
中,没有三个用于分辨率的参数。这就是为什么C 说"未解决的超负荷"。
解决方案是将lerp
施加到F:if (f==static_cast<decltype(f)>(&lerp))
的类型。用于超载分辨率的三个参数是f
。
问题是因为GLM也定义了LERP函数,因此编译器无法选择我也引用了哪个函数。
如评论中所建议的,解决方案是将我的功能从lerp
重命名为mlerp
我想这是一个很好的例子,说明为什么使用名称空间不是一个好主意。
这不是解决错误的答案,而是对您使用方法名称的答案。
我建议您使用std :: unordered_map区分不同的功能。
std::unordered_map<void*, const char*> funcmap{4};
union cast_fptr {
dvec3 (*)(dvec3, dvec3, double) fptr;
void *void_ptr;
};
#define MAP_VAL(FUNC_NAME) std::pair<void*, const char*>{cast_fptr{.fptr = &FUNC_NAME}.void_ptr, #FUNC_NAME}
funcmap.insert({MAP_VAL(lerp), MAP_VAL(plerp), MAP_VAL(splerp), MAP_VAL(ilerp)});
#undef MAP_VAL
inline const char* erpToString(dvec3 (*f)(dvec3, dvec3, double)) noexcept {
return funcmap[f];
}
- C++自定义比较函数
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- C++模板函数,用于比较任何无符号整数和有符号整数
- 函数类作为比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- std::max() 函数与定点实现的比较中的问题
- 如何比较两个函数的速度和性能
- 对没有比较器或λ函数的向量进行排序?
- 使用迭代器的自定义比较器函数
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 比较 n 女王的 next_permutation 函数
- 用于基于成员字段或函数创建比较器的快捷方式
- 为什么 std::stable_sort() 的比较函数的参数必须是设置常量?
- 为什么在类或结构中传递自定义比较器函数?
- 浮点数比较为什么没有相等的函数
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 为什么函数比较器不像在排序中那样在优先级队列中工作?
- c++ STL集合的比较函数:比较函数可以是类的成员函数吗?
- 联合值的单函数比较