我需要定义一个模板结构,以便:
element<T>::type
的类型为:
T::element_type
如果T包含一个名为element_type的(公共)typedef,否则(如果它不包含这样的typedef)
element<T>::type
的类型为
T::value_type
如果T是可变的并且类型为
const T::value_type
如果T是常数。
我真的很挣钱,任何建议都非常感谢! :)
非常感谢您的帮助!
答案 0 :(得分:4)
可能是这样的:
template <typename T>
struct has_element_type
{
typedef char yes[1];
typedef char no[2];
template <typename C>
static yes& test(typename C::element_type*);
template <typename>
static no& test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
template <typename T>
struct is_const
{
static const bool value = false;
};
template <typename T>
struct is_const<const T>
{
static const bool value = true;
};
template <typename, bool> // true -> const
struct value_type_switch;
template <typename T>
struct value_type_switch<T, true>
{
typedef const typename T::value_type type;
};
template <typename T>
struct value_type_switch<T, false>
{
typedef typename T::value_type type;
};
template <typename, bool> // true -> has element_type
struct element_type_switch;
template <typename T>
struct element_type_switch<T, true>
{
typedef typename T::element_type type;
};
template <typename T>
struct element_type_switch<T, false>
{
typedef typename value_type_switch<T, is_const<T>::value>::type type;
};
template <typename T>
struct element
{
typedef typename element_type_switch<T,
has_element_type<T>::value>::type type;
};
这当然应该分开组织。
答案 1 :(得分:1)
作为使用SFINAE声明特征类的替代方法,您可以使用部分特化更巧妙地使用它。
template< typename T >
struct empty { // support class is like stripped-down enable_if
typedef void type;
};
template< class T, typename v = void > // v is always void!
struct element {
typedef typename T::value_type type;
};
template< class T, typename v >
struct element< T const, v > {
typedef typename T::value_type const type;
};
template< class T > // T in deduced context, T::element_type is SFINAE:
struct element< T, typename empty< typename T::element_type >::type > {
typedef typename T::element_type type;
};
...你可能想要添加另一个案例来为element_type
制作const T
const吗?不幸的是,这在GCC中不起作用,尽管Comeau接受了它。
template< class T >
struct element< T const, typename empty< typename T::element_type >::type > {
typedef typename T::element_type const type;
};
我用来测试这个代码:
struct has_et {
typedef int element_type;
};
struct has_vt {
typedef char value_type;
};
char c;
int i;
element<has_vt>::type *cp = &c;
element<has_et>::type *ip = &i;