代码之家  ›  专栏  ›  技术社区  ›  Edward Strange

这行吗?

  •  2
  • Edward Strange  · 技术社区  · 14 年前

    我正试图将元函数专门化为一个类型,该类型的参数之一是函数指针。代码编译得很好,但与类型不匹配。

    #include <iostream>
    #include <boost/mpl/bool.hpp>
    #include <boost/mpl/identity.hpp>
    
    template < typename CONT, typename NAME, typename TYPE, TYPE (CONT::*getter)() const, void (CONT::*setter)(TYPE const&) >
    struct metafield_fun {};
    
    struct test_field {};
    
    struct test
    {
      int testing() const { return 5; }
      void testing(int const&) {}
    };
    
    template < typename T >
    struct field_writable : boost::mpl::identity<T> {};
    
    template < typename CONT, typename NAME, typename TYPE, TYPE (CONT::*getter)() const >
    struct field_writable< metafield_fun<CONT,NAME,TYPE,getter,0> > : boost::mpl::false_
    {};
    
    typedef metafield_fun<test, test_field, int, &test::testing, 0> unwritable;
    
    int main()
    {
      std::cout << typeid(field_writable<unwritable>::type).name() << std::endl;
    
      std::cin.get();
    }
    

    输出始终是传入的类型,而不是bool_uuu。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Georg Fritzsche    14 年前

    作为一个不存在评论中提到的转换问题的工作备选方案:

    struct rw_tag {};
    struct ro_tag {};
    
    template<typename CONT, typename NAME, typename TYPE,
             TYPE (CONT::*getter)() const, void (CONT::*setter)(TYPE const&)>
    struct metafield_fun_rw : rw_tag {};
    
    template<typename CONT, typename NAME, typename TYPE,
             TYPE (CONT::*getter)() const>
    struct metafield_fun_ro : ro_tag {};
    
    template<class T> struct field_writable 
      : boost::mpl::bool_< boost::is_base_of<rw_tag, T>::value >
    // or just derive directly from: boost::is_base_of<rw_tag, T>::value
    {};
    
    typedef metafield_fun_ro<test, test_field, int, &test::testing> unwritable;
    

    替代地 metafield_fun 也可以 typedef readwrite-/readonly标记取决于其参数和 field_writable 有条件地派生,比如使用 boost::mpl::if_ .