【问题标题】:How do I declare a C++ prototype with a void * pointer so that it can take any pointer type?如何使用 void * 指针声明 C++ 原型,以便它可以采用任何指针类型?
【发布时间】:2011-09-25 17:05:59
【问题描述】:

我想在 C++ 中创建一个函数原型,以便有一个 void * 参数可以接受任何类型的指针。我知道这在 C 中是可能的。在 C++ 中可能吗?

[编辑] 这是我试图开始工作的代码的简化版本:

#include <stdio.h>

void func(void (f)(const void *))
{
    int i = 3;
    (*f)(&i);
}

void func_i(const int *i)
{
    printf("i=%p\n",i);
}

void func_f(const float *f)
{
    printf("f=%p\n",f);
}

void bar()
{
    func(func_i);
}

这是编译器的输出:

$ g++ -c -Wall x.cpp
x.cpp: In function ‘void bar()’:
x.cpp:21: error: invalid conversion from ‘void (*)(const int*)’ to ‘void (*)(const void*)’
x.cpp:21: error:   initializing argument 1 of ‘void func(void (*)(const void*))’
$ %

【问题讨论】:

  • 你打算用这些指针做什么?
  • C++ (几乎)是 C 的超集,所以如果您的目标只是在 C++ 中做与在 C 中所做的相同的事情,那么您可以做到。但是,如果您提出正确的问题,通常会有更好的方法。你到底想做什么?
  • 嗯。出于某种原因,这适用于我的小测试用例,但不适用于我的大程序。让我处理测试用例...
  • 您在代码中显示的内容肯定不能在 C++ 中完成。必须始终明确地在 void 和任何其他之间进行转换。使用 Benoit 提供的模板解决方案会更好
  • stackoverflow.com/questions/559581/… .. 这可能会让你感兴趣 :)

标签: c++ void-pointers


【解决方案1】:

您可以像使用 C 一样使用 void*,但在调用它时需要转换参数。我建议你使用模板函数

template<typename T>
void doSomething(T* t) {...}

【讨论】:

  • 不幸的是,这在我的应用程序中不起作用。我需要将所有函数放入一个数组中。
  • @vy32:您能否更详细地解释一下您到底需要做什么?可能根本不需要使用 void * !你可以用 boost bind 和 boost 函数做你想做的事
【解决方案2】:

是的。

int i = 345;
void * ptr = &i;
int k = *static_cast&lt int* &gt(ptr);

更新 :: 您在代码中显示的内容肯定不能在 C++ 中完成。 必须始终明确完成 void 和任何其他之间的转换。 检查这些 SO 链接以获取有关 C 标准必须说的更多详细信息: 1) http://stackoverflow.com/questions/188839/function-pointer-cast-to-different-signature 2)http://stackoverflow.com/questions/559581/casting-a-function-pointer-to-another-type

【讨论】:

  • 可惜,这是一个有用的想法。也许我应该使用“...”之类的。哦,好吧。
【解决方案3】:

怎么样:

void func(void *);

和 C 语言中的一模一样吗? :P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多