【问题标题】:Metafunction to extract argument parameter lists from multiple functions pointers从多个函数指针中提取参数参数列表的元函数
【发布时间】:2016-12-22 21:26:02
【问题描述】:

对于单个函数,可以像这样提取其参数类型:

template <class T>
struct Foo;

template <class Ret, class... Args>
struct Foo<Ret(*)(Args...)> { /* stuff */ };

可以对一系列函数指针做同样的事情吗?那是, 能够提取参数然后以相同的方式重新部署它们?例如。类似:

template <class.. T>
struct Foo;

template <class... Rets, class... Args>
struct Foo<Rets(*)(Args...)...>           // I wish this worked
{
    std::tuple<Rets(*)(Args...)...> fns;  // Ditto
}

【问题讨论】:

  • template &lt;typename ...Fs&gt; struct Foo; 开始,然后为每个包成员分派到您现有的代码。
  • @KerrekSB 抱歉,您能详细说明一下吗?我不太清楚你说的后一点是什么意思。
  • 你已经有了处理one函数类型的方法。您可以对不同模板包中的每个成员重复使用该工具。

标签: c++ function types parameters metaprogramming


【解决方案1】:

聚会迟到了,但这可能有用。首先让我们定义一些实用程序:

template <class... T>
using void_t = void;

template <bool...> struct bool_pack;

template <bool... v>
using all_true = std::is_same<bool_pack<true, v...>, bool_pack<v..., true>>;

然后是一个元函数来检查一个类型是否是一个函数指针:

template <class F>
struct is_function_pointer : std::integral_constant<bool, false> { };

template <class Ret, class... Args>
struct is_function_pointer<Ret (*)(Args...)> : std::integral_constant<bool, true> { };

使用这些,让我们编写类。 SFINAE 切换首先放置,因为可变参数包占据了右侧:

template <class = void_t<>, class... T>
struct Foo_impl;

template <class... FuncPtrs>
struct Foo_impl<
    std::enable_if_t<all_true<is_function_pointer<FuncPtrs>{}...>{}>,
    FuncPtrs...
> {
    std::tuple<FuncPtrs...> fns;
};

最后,一个 typedef 用于向用户隐藏 SFINAE 切换:

template <class... T>
using Foo = Foo_impl<void_t<>, T...>;

瞧! Foo&lt;void (*)(), int (*)(double)&gt; 转到包含适当元组的 Foo_impl 的特化,Foo&lt;int, double&gt; 转到主模板。

See it live on Coliru

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多