使用boost :: hana获取函数参数的类型

时间:2016-05-25 01:11:38

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

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

    var audioCtx = new AudioContext();
    var source = audioCtx.createMediaElementSource(myMediaElement);
        myMediaElement = document.createElement("audio");
        myMediaElement.setAttribute("autoplay", true);
        myMediaElement.setAttribute("src", uri);
        myMediaElement.setAttribute("controls", "controls");
        document.getElementById('player').appendChild(myMediaElement);
    source.connect(audioCtx.destination);

如何在此处获取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

1 个答案:

答案 0 :(得分:5)

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

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

请记住,图书馆目前正在进行重大更改,并且链接文档有些过时(即使用风险自负)。如果您使用它,我建议克隆develop branch。对于您正在寻找的功能,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或您的用例所需的任何内容。

Live example