title: how to avoid static_cast when using std::make_tuple with overloaded functions
body: <p>g++ says </p>
  
  <blockquote>
    <p>error: too many arguments to function 'constexpr std::tuple </p>
  </blockquote>
  
  <p>if I leave out the static_cast in the <code>std::make_tuple</code> call</p>
  
  <pre class="lang-cpp prettyprint-override"><code>#include &lt;tuple&gt;
  
  typedef int (*func_t)();
  
  int number() {
    return 2;
  }
  
  double number(bool a) {
    return 1.2;
  }
  
  int main() {
    // With a static_cast it compiles without any error
    // std::tuple&lt;func_t&gt; tup = std::make_tuple(static_cast&lt;func_t&gt;(number));                                                               
  
    std::tuple&lt;func_t&gt; tup = std::make_tuple(number);
    return 0;
  }
  </code></pre>
  
  <p>Here is full error message:</p>
  
  <pre><code>$ g++ -std=c++11 test.cc
  test.cc: In function 'int main()':
  test.cc:31:54: error: too many arguments to function 'constexpr std::tuple&lt;typename std::__decay_and_strip&lt;_Elements&gt;::__type ...&gt; std::make_tuple(_Elements&amp;&amp; ...) [with _Elements = {}; typename std::__decay_and_strip&lt;_Elements&gt;::__type = &lt;type error&gt;]'
  In file included from test.cc:1:0:
  /usr/include/c++/4.7/tuple:844:5: note: declared here
  test.cc:31:54: error: conversion from 'std::tuple&lt;&gt;' to non-scalar type 'std::tuple&lt;int (*)()&gt;' requested
  $ g++ --version
  g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
  Copyright (C) 2012 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  </code></pre>
  
  <p>If I change the main function to </p>
  
  <pre class="lang-cpp prettyprint-override"><code>int main() {
    std::tuple&lt;func_t&gt; tup = std::make_tuple(static_cast&lt;func_t&gt;(number));                                                               
    return 0;
  }
  </code></pre>
  
  <p>the program compiles just fine. Is it possible to leave out the static_cast somehow? It seems unnecessary to provide the type <strong>func_t</strong> two times.</p>