将 void* 转换为 std::function

问题描述 投票:0回答:2

我有一个问题。我正在尝试将 void* 转换为 std::function 。 这只是一个简单的例子,任何建议将不胜感激

#.h file
class Example {

public:

  Example();
  int foo(void* hi);

  int fooFunc(std::function<int(int, int)> const& arg, int x, int y) {
    foo(arg.target<void*>(), x, y);
    return 2;
  }

};


#.cpp file
Example::Example() {

  }

  int Example::foo(void * func, int x, int y)
  {
    //cast back to std::function
    func(x, y);
    std::cout << "running in foo: " << a << "\n";
    return a;
  }

我尝试的每一次选角都不起作用。

我知道我可以在这个例子中发送一个

std::function
,但这是为了更大的事情,我正在研究一个例子以使其在这里工作。

void*
的全部含义,是有时在这些情况下使用它,当你不知道你会收到什么时,然后将其转换为你需要的特定用法。

谢谢!

c++11 casting void-pointers std-function
2个回答
5
投票

你不能。

您可以将数据指针转换为

void*
,然后返回到您开始使用的相同指针类型。
std::function
不是指针类型,因此强制转换在静态上是无效的,并且它与您开始时的情况不同。您从
.target
类型的
void(*)()
开始,但它不是数据指针,而是函数指针,因此将其转换为
void*
并返回是实现定义的。

您可以:

  1. 忽略该问题并投射到
    void(*)()
    。将适用于大多数(但不是全部)平台。
  2. 使用
    void(*)()
    而不是
    void*
    作为通用函数指针(您可以将其转换为其他函数类型)。
  3. 使用 C++ 提供的任何工具来完全避免强制转换。

0
投票

如果您还没有尝试过,C++ 允许使用 std::any 代替传统的 void 指针,并且它具有我们在 std::unique_ptr 中看到的许多功能: https://en.cppreference.com/w/cpp/utility/any

希望这能满足您的需要。

© www.soinside.com 2019 - 2024. All rights reserved.