title: Should this work?
body: <p>I am trying to specialize a metafunction upon a type that has a function pointer as one of its parameters.  The code compiles just fine but it will simply not match the type.</p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;boost/mpl/bool.hpp&gt;
  #include &lt;boost/mpl/identity.hpp&gt;
  
  template &lt; typename CONT, typename NAME, typename TYPE, TYPE (CONT::*getter)() const, void (CONT::*setter)(TYPE const&amp;) &gt;
  struct metafield_fun {};
  
  struct test_field {};
  
  struct test
  {
    int testing() const { return 5; }
    void testing(int const&amp;) {}
  };
  
  template &lt; typename T &gt;
  struct field_writable : boost::mpl::identity&lt;T&gt; {};
  
  template &lt; typename CONT, typename NAME, typename TYPE, TYPE (CONT::*getter)() const &gt;
  struct field_writable&lt; metafield_fun&lt;CONT,NAME,TYPE,getter,0&gt; &gt; : boost::mpl::false_
  {};
  
  typedef metafield_fun&lt;test, test_field, int, &amp;test::testing, 0&gt; unwritable;
  
  int main()
  {
    std::cout &lt;&lt; typeid(field_writable&lt;unwritable&gt;::type).name() &lt;&lt; std::endl;
  
    std::cin.get();
  }
  </code></pre>
  
  <p>Output is always the type passed in, never bool_.</p>