【问题标题】:Get the type of a function parameter with boost::hana使用 boost::hana 获取函数参数的类型
【发布时间】:2016-05-25 01:11:38
【问题描述】:

我知道如何以旧方式获取函数参数的类型,但我想知道是否有一种很好的新方式来使用 Hana 呢?例如,我想要这样的东西:

struct foo {
    int func(float);
};

auto getFuncType(auto t) -> declval<decltype(t)::type>()::func(TYPE?) {}
getFunType(type_c<foo>); // should equal type_c<float> or similar

如何在此处获取TYPE

【问题讨论】:

  • 不,我没有,我会调查的。它的扩展性如何?它似乎仍然使用 MPL 作为其后端,由于编译时间的原因,我试图避免这种情况。
  • 如果您不想自己动手,AFAIK,建议的 Boost.CallableTraits 是现代解决方案。
  • 我假设您知道您的问题通常无法解决,并且您要求一些有限的解决方案?
  • 我想提一下,这超出了 Hana 的范围,因为 Hana 本身不提供任何特征。它的作用是提供一种使用函数语法使用现有特征(例如来自&lt;type_traits&gt;)的方法,但它没有定义任何新特征。

标签: c++ boost c++14 boost-hana


【解决方案1】:

2016 年 6 月 21 日编辑 - 进行细微更改以匹配当前版本的库 (0.4)。

我是 CallableTraits 的作者,这是 @ildjarn 上面提到的库(尽管它尚未包含在 Boost 中)。 arg_at_t 元函数是我所知道的从成员函数、函数、函数指针、函数引用或函数对象/lambda 中获取参数类型的最佳方法。

请记住,该库目前正在发生重大变化,并且链接的文档有些过时(即使用风险自负)。如果你使用它,我建议克隆develop branch。对于您正在寻找的功能,API 几乎肯定不会改变。

对于成员函数指针,arg_at_t&lt;0, mem_fn_ptr&gt;decltype(*this) 取别名,以说明隐含的 this 指针。因此,对于您的情况,您可以这样做:

#include <type_traits>
#include <callable_traits/arg_at.hpp>

struct foo {
    int func(float);
};

using func_param = callable_traits::arg_at_t<1, decltype(&foo::func)>;

static_assert(std::is_same<func_param, float>::value, "");

int main(){}

然后,您可以将其放入 boost::hana::type 或您的用例所需的任何内容中。

Live example

【讨论】:

  • 您能否详细说明一下哪些内容可以稳定,哪些内容将在库中进行更改?除了文档之外,我可以假设一般功能将保留还是会进行重大改革?
  • @user975989 由于这里没有空间回答你的问题,我在this GitHub Gist回答了。
  • @user975989 我更新了我的答案以反映最新版本的变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
相关资源
最近更新 更多