例如:
template <typename T> void foo(T ptr) { typedef GET_CLASS_TYPE(T) ClassT; typedef GET_VALUE_TYPE(T) ValueT; // ... } struct Bar { int var; }; foo(&Bar::var);在对foo(...)的最后一个函数调用中,ClassT应该是Bar,而ValueT应该是int.
Inside the last function call to foo(...), ClassT should be Bar and ValueT should be int.
我该如何使用普通C ++(不能使用C ++ 11功能)或增强功能?
How can I do this with plain C++ (can't use C++11 features), or boost?
推荐答案不知道要使用任何现成的Boost类型特征,但是您可以使用模板专门化来编写相同的内容:
Not aware of any out-of-the-box Boost type trait to do this, but the same can be written by yourself using template specialization:
template<typename T> struct member_pointer_class; template<typename Class, typename Value> struct member_pointer_class<Value Class::*> { typedef Class type; }; template<typename T> struct member_pointer_value; template<typename Class, typename Value> struct member_pointer_value<Value Class::*> { typedef Value type; }; // TEST #include <boost/type_traits.hpp> #include <boost/static_assert.hpp> struct Bar { int var; }; template <typename T> void foo(T ptr) { // test the code typedef typename member_pointer_class<T>::type ClassT; typedef typename member_pointer_value<T>::type ValueT; BOOST_STATIC_ASSERT_MSG((boost::is_same<ClassT, Bar>::value), "member_pointer_class is the same as Bar"); BOOST_STATIC_ASSERT_MSG((boost::is_same<ValueT, int>::value), "member_pointer_value is the same as int"); } int main() { foo(&Bar::var); }说明:
使用模板推论,我们提取成员指针的有趣类型-将typedefs member_pointer_class<T>::type和member_pointer_value<T>::type定义为适当的类型.需要 typename模板中的歧义.该代码还可用于指向成员函数的指针.
Using template deduction we extract the interesting types of the member pointer - the typedefs member_pointer_class<T>::type and member_pointer_value<T>::type are defined to the appropriate types. typename is required for disambiguation in templates. The code can be also used for pointer to member functions.
如果类型不是指向成员的指针,则member_pointer_class<T>::type会给出编译器错误.
If the type is not a pointer to member, the member_pointer_class<T>::type gives a compiler error.
更多推荐
从指向成员变量的指针获取类和成员类型
发布评论