首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何定义需要五倍于同一参数类型的函数类型

如何定义需要五倍于同一参数类型的函数类型
EN

Stack Overflow用户
提问于 2014-07-10 00:37:14
回答 3查看 109关注 0票数 0

我想知道,仅仅通过知道n和这些参数的类型,是否有可能定义一个接受n参数的函数类型。

例如,我们可以有如下内容:

代码语言:javascript
运行
AI代码解释
复制
template<int N> struct test {
  typedef void(*)(E,E,E,...) fct; //E is written N times
};

在C++11中,使用递归性实例化具有N倍相同类型的可变模板很容易,但我不知道如何将其转换为有效的函数指针类型。

当我输入这些单词时,我想到了解决方案。我会回答我自己,所以这些知识可以在未来帮助别人。

EN

回答 3

Stack Overflow用户

发布于 2014-07-10 01:02:42

如果你想要一个更简单的解决方案,你可以让这个函数接受一个std::array<T, N>。直接在括号内初始化数组,使其看起来更像是一个普通的函数调用:

代码语言:javascript
运行
AI代码解释
复制
foo({1, 2, 3})  // to pass a std::array<int, 3>
票数 2
EN

Stack Overflow用户

发布于 2014-07-10 00:37:14

当我打字的时候,我突然想到了C++11的解决方案,诀窍是使用泛型Fct模板类型,并将其特殊化为函数类型,使用可变模板类型作为函数“特殊化”的参数。

代码语言:javascript
运行
AI代码解释
复制
template< typename Fct, typename NewArg > struct functional_append_arg;
template< typename Ret, typename... Args, typename NewArg >
struct functional_append_arg< Ret(Args...), NewArg >
    { using type = Ret(Args...,NewArg); };
template< typename Ret, typename Arg, int N> struct functional_repeat_arg;
    { using type = functional_append_arg< functional_repeat_arg<Ret,Arg,N-1>::type, Arg >::type; };
template< typename Ret, typename Arg> struct functional_repeat_arg<Ret,Arg,0>;
    { using type = Ret(); }
票数 1
EN

Stack Overflow用户

发布于 2014-07-10 05:27:09

我们可以在这里再次利用索引技巧来代替递归变量技术。

代码语言:javascript
运行
AI代码解释
复制
#include <cstddef>
#include <utility>

template <typename T, std::size_t N>
struct repeat {
  private:

  /* Map any index to T. */
  template <std::size_t>
  using T_ = T;

  /* Function pointer that takes Ts. */
  template <typename... Ts>
  using Fn = void (*)(Ts...);

  /* A function returning void (*)(T...). */
  template <std::size_t... Is>
  static Fn<T_<Is>...> impl(std::index_sequence<Is...>);

  public:

  /* Get the return type of impl. */
  using type = decltype(impl(std::make_index_sequence<N>()));

};  // repeat

static_assert(std::is_same<repeat<int, 5>::type,
                           void (*)(int, int, int, int, int)>::value, "");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24665796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档