【问题标题】:Unpacking arguments of a functional parameter to a C++ template class将功能参数的参数解包到 C++ 模板类
【发布时间】:2014-09-16 20:50:21
【问题描述】:

我有一个问题涉及 C++ 中模板类的功能模板参数。

我想定义一个模板类Foo,采用单个模板参数Fun

   template <typename Fun>
   struct Foo {
      ...
   };

这样给定一个函数

   void bar(std::string a, float b, char c)
   {
      ...
   }

那么Foo&lt;bar&gt;::args_t 将相当于一个typedef

   std::tuple<std::string, float, char>

这可能吗? (这里使用std::tuple 只是为了具体。更一般地说,我想知道是否可以对功能模板参数的参数进行模式匹配。)

关键是避免必须以类似的方式定义Foo

   template Foo<typename A, typename B, typename C, typename D,
      D (*Fun)(A a, B b, C c)>
   struct Foo {
      typedef std::tuple<A,B,C>  args_t;
   };

这需要提交固定数量的函数参数,并要求函数的参数和返回类型作为模板参数显式提供。 (使用可变参数模板定义Foo大概可以解决前一个问题,但后者呢?)

谢谢!

【问题讨论】:

  • 查看可变参数模板。此外,您可能希望避免使用 _t 命名类型,因为它们在 POSIX 中保留。
  • @user657267 我非常了解可变参数模板,并在我的问题中提到了它们。关于使用_t 命名类型的评论似乎有点超出了左侧字段。
  • 这就是为什么它是评论而不是答案。

标签: c++ templates c++11 variadic-templates


【解决方案1】:

声明一个主模板并保持未实现。

template<typename T>
struct foo;     // unimplemented primary template

然后提供与函数类型匹配的部分特化作为模板参数。

template<typename Result, typename... Args>
struct foo<Result(Args...)>
{
    using args_t = std::tuple<Args...>;
};

你可以访问嵌套类型

foo<decltype(bar)>::args_t

Live demo

【讨论】:

  • 太好了,decltype 似乎是这里的关键,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多