C++ 试图从 std::function 获取函数地址

标签 c++ function pointers std

我正在尝试从 std::function 中查找函数的地址。

第一个解决方案是:

size_t getAddress(std::function<void (void)> function) {
    typedef void (fnType)(void);
    fnType ** fnPointer = function.target<fnType *>();
    return (size_t) *fnPointer;
}

但这仅适用于具有 (void ()) 签名的函数,因为我需要该函数 签名是 (void (Type &)),我试着做

template<typename T>
size_t getAddress(std::function<void (T &)> function) {
    typedef void (fnType)(T &);
    fnType ** fnPointer = function.target<fnType *>();
    return (size_t) *fnPointer;
}

我得到“错误 - 函数样式转换或类型构造的预期'('”

更新:有什么方法可以捕获成员类地址?对于我正在使用的类(class)成员:

template<typename Clazz, typename Return, typename ...Arguments>
size_t getMemberAddress(std::function<Return (Clazz::*)(Arguments...)> & executor) {
    typedef Return (Clazz::*fnType)(Arguments...);
    fnType ** fnPointer = executor.template target<fnType *>();
    if (fnPointer != nullptr) {
        return (size_t) * fnPointer;
    }
    return 0;
}

更新:捕获我正在使用的 lambda

template <typename Function>
struct function_traits
    : public function_traits<decltype(&Function::operator())> {
};

template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const> {
    typedef ReturnType (*pointer)(Args...);
    typedef std::function<ReturnType(Args...)> function;
};

template <typename Function>
typename function_traits<Function>::function
to_function (Function & lambda) {
    return static_cast<typename function_traits<Function>::function>(lambda);
}

template <typename Lambda>
size_t getAddress(Lambda lambda) {
    auto function = new decltype(to_function(lambda))(to_function(lambda));
    void * func = static_cast<void *>(function);
    return (size_t)func;
}

std::cout << getAddress([] { std::cout << "Hello" << std::endl;}) << std::endl;

最佳答案

调用target时需要使用template关键字:

#include <functional>
#include <iostream>

template<typename T>
size_t getAddress(std::function<void (T &)> f) {
    typedef void (fnType)(T &);
    fnType ** fnPointer = f.template target<fnType*>();
    return (size_t) *fnPointer;
}

void foo(int& a) {
    a = 0;
}

int main() {
    std::function<void(int&)> f = &foo;
    std::cout << (size_t)&foo << std::endl << getAddress(f) << std::endl;
    return 0;
}

提示:当你遇到 C++ 语法问题时,我建议你使用 clang++ 来编译你的代码。如果您尝试编写代码的方式,它通常会为您指出编写方向以修复错误(当它可以弄清楚您在做什么时)。

我还建议您使用可变参数模板使您的函数更通用:

template<typename T, typename... U>
size_t getAddress(std::function<T(U...)> f) {
    typedef T(fnType)(U...);
    fnType ** fnPointer = f.template target<fnType*>();
    return (size_t) *fnPointer;
}

关于C++ 试图从 std::function 获取函数地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18039723/

相关文章:

iOS:不存在的指针正在崩溃应用程序

c++ - 在 Winx64 上使用 User32InitializeImmEntryTable?

c++ - Visual Studio : how to handle project dependencies right?

c++定义没有模板参数的成员类的类型

c++ - 通过 const 引用将参数传递给非 void 函数 : is it considered as a side effect?

c++ - 使用类的 Hangman 游戏无法正常工作

c++ - 我可以在这种情况下使用全局变量吗?

python - 有多少人在一周中的每一天的给定时间工作,python

c++ - 全局指针由优化器解析 - 但引用不是 - 为什么?

c - 通过在堆上分配与在堆栈上分配创建的指针之间的差异