将函数参数的参数解包到C ++模板类

时间:2014-07-25 04:49:24

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

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

我想定义一个模板类Foo,只需一个模板参数Fun

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

这样就给出了像

这样的函数
   void bar(std::string a, float b, char c)
   {
      ...
   }

然后Foo<bar>::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可能会解决前一个问题,但后者又如何呢?)

谢谢!

1 个答案:

答案 0 :(得分:13)

声明主要模板并将其保留为未实现。

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