我试图专门针对具有函数指针作为其参数之一的类型的元函数。代码可以很好地编译,但是根本不匹配类型。
#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_。
最佳答案
作为没有注释中提到的转换问题的可行替代方案:
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
读写标签/只读标签进行标记,并且field_writable
有条件地派生,例如使用boost::mpl::if_
。关于c++ - 应该行吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2828816/