将函数形参的实参解包到c++模板类

Unpacking arguments of a functional parameter to a C++ template class

本文关键字:c++ 函数 形参 实参      更新时间:2023-10-16

我有一个问题,涉及到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可能会解决前一个问题,但后者呢?)

谢谢!

声明一个主模板,并保持它不被实现。

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

现场演示