从指向成员变量的指针获取类和成员类型 [英] Getting class and member type from pointer to member variable
问题描述
例如:
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.
这篇关于从指向成员变量的指针获取类和成员类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!