title: What's the actual type in this lambda function?
body: <p>I have a code that combines 3 lambda functions:</p>
  
  <pre><code>#include &lt;functional&gt;
  #include &lt;iostream&gt;
  using namespace std;
  
  template &lt;typename F, typename G, typename H&gt;
      auto concat(F f, G g, H h) {
      return [=](auto... parameters) {
          return f( g( h( parameters... ) ) );
      };
  }
  
  int main() {
      auto func1 (
          [](int i) {
              return (i * 2);
          }
      );
  
      auto func2 (
          [](int i) {
              return (i % 2);
          }
      );
  
      auto combined (
          concat(func1, func2, greater&lt;int&gt;{})
      );
  
      cout &lt;&lt; combined(3, 2) &lt;&lt; endl;
  
      return 0;
  }
  </code></pre>
  
  <p>My question is: what is the actual type (F, G, H) in template? Is it a function pointer, or a function object, or something else? How can I illustrate its type in code?</p>