【问题标题】:Can I extract function arguments from a function pointer?我可以从函数指针中提取函数参数吗?
【发布时间】:2011-04-08 21:32:36
【问题描述】:

我可以从函数指针中提取额外信息(如参数数量及其类型)吗?如果(很可能)不是,那么允许程序员传入函数指针和 可变数量的参数 EDIT: I meant that it should allow functions with different number of arguments 的最佳方法是什么,同时确保程序员不会通过参数类型不正确。

我想做的事: 将函数及其参数公开给脚本语言,而无需程序员手动输入参数(因此在程序员传递函数指针和函数接受的不正确参数时会出现错误)。

再澄清一点:我应该能够输出函数名称和参数类型以用于文档目的。

----------------- 解决方案 -----------------

James 的答案正是我想要的。这是代码,因为它是一个复杂的,应该可以帮助任何陷入相同情况的人。

boost::function_traits<boost::remove_pointer
                         <BOOST_TYPEOF(&SomeFunction)>::type>::arg2_type);

如果您需要输出,请使用 RTTI(假设您在编译器中启用了 RTTI)

std::cout << typeid(boost::function_traits<boost::remove_pointer
    <BOOST_TYPEOF(&SomeFunction)>::type>::arg2_type).name() << std::endl;

【问题讨论】:

  • “可变数量的参数”是什么意思?你的意思是有些函数会有可变参数,还是说不同的函数会有不同数量的参数。
  • 您必须在编译时调用具有正确数量参数的函数(指针)。你所描述的没有意义。
  • @David:不同的函数会有不同数量的参数
  • @Oli:所描述的方法可能有点不连贯,但表达的目标非常有意义,至少对我而言。曾经从 VB 或 .NET 调用过 WinAPI(或任何本机 DLL)函数,您必须生成匹配的声明来描述要导入的函数,包括所有参数。他似乎想从 C++ 类型信息中自动执行此操作。
  • @Ben:我的印象是他/她希望能够在运行时动态调用任意函数。

标签: c++ scripting function-pointers


【解决方案1】:

您可以使用function_traits from the Boost.TypeTraits library 获取函数的arity、返回类型和参数类型。

要完全启用您所描述的场景,即拥有类型安全的有效可变参数函数,您确实需要可变参数模板,这是 C++0x 中添加的一个新功能,并得到一些最近发布的编译器(例如 Clang、 GCC)。如果您需要更广泛的内容,您可能需要实现自己的运行时类型系统。

【讨论】:

  • 虽然我选择了这个答案作为正确答案,但我还没有弄清楚如何让function_traits 使用函数而不仅仅是它们的类型(例如,传入function_traits&lt;SomeFunction&gt; 而不是@987654325 @)
  • 我已经想通了。请参阅我原来的问题中的编辑。感谢 James 的建议,正是我所需要的。
【解决方案2】:

我不完全清楚你在追求什么,但boost.function_types 可以告诉你函数指针的返回类型、参数数量和参数类型。

【讨论】:

    【解决方案3】:

    您可能需要考虑使用Boost::Function 库和Boost::TypeTraits。我发现 Boost::Function 使函数指针更易于处理,并允许您以通用方式使用函数对象(即您不受函数对象类型的限制,这是一种痛苦),这些都比原始函数指针

    【讨论】:

      【解决方案4】:

      您可以将doxygen xml output 转换为适合您的脚本语言的声明/元数据。 this other question 中的信息可能会帮助您入门。否则SWIG 可能会对您有所帮助,它专为生成跨语言包装器而设计,并且可能生成与您选择的脚本语言兼容的它们。

      【讨论】:

        猜你喜欢
        • 2013-11-22
        • 2016-12-22
        • 2021-07-25
        • 2021-01-24
        • 2021-12-18
        • 2012-01-04
        • 2010-09-20
        • 2019-08-22
        • 2021-12-08
        相关资源
        最近更新 更多