這裡看一下is_placehoder模板
在is_placeholder.hpp中,有如下定義:
namespace boost{template< class T > struct is_placeholder{ enum _vt { value = 0 };};}
在arg.hpp中,還有幾個偏特化版本的定義:
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )template< int I > struct is_placeholder< arg<I> >{ enum _vt { value = I };};template< int I > struct is_placeholder< arg<I> (*) () >{ enum _vt { value = I };};#endif
is_placeholder的第一個特化版本接受arg<I>作為模板參數,並且將I的值賦值給內部成員value,
第二個特化版本接受函數指標作為模板參數,返回arg<I>, 沒有參數。
如果模板參數T不是arg<I>類型或者函數指標,則使用is_placeholder.hpp中的普通模板定義,將value設定為0.
看下面的代碼示範了如何使用
int z = boost::is_placeholder<boost::arg<9> >::value; int q = boost::is_placeholder<string >::value;
z變數的值就是9.而q變數的值就是0,因為string不是arg<I>類型
boost::arg<1> F() { return _1;}typedef boost::arg<1> (*FPointer)();....cout << boost::is_placeholder<FPointer>::value << endl;
上面的代碼示範了函數指標作為模板參數使用的方法。
總結,is_placeholder模板的作用是:
1.接受模板參數,判斷是否是boost::arg<N>類型或者返回該類型的函數指標
2.如果不是,則value為0
3.如果是,則value為N