3

I know how to get the type of a function's parameter the old way, but I was wondering if there is a nice new way to do it with Hana? For example, I want something like this:

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

How do I get the TYPE here?

4

1 回答 1

5

2016 年 6 月 21 日编辑 - 与当前版本的库 (0.4) 相匹配的微小更改。

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

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

对于成员函数指针,arg_at_t<0, mem_fn_ptr>别名相当于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或您的用例需要的任何内容中。

活生生的例子

于 2016-05-25T18:12:25.643 回答