统一容器特性
Unifying container traits
我想构建能够回答 is_vector
、is_list
等问题的特征。问题是我必须为每个版本制作两个版本,即模板模板参数一:
template<template<class,class> class C>
struct is_vector1 : std::false_type { };
template<>
struct is_vector1<std::vector> : std::true_type { };
和简单模板参数一:
template<class T>
struct is_vector2 : std::false_type { };
template<class T, class Alloc>
struct is_vector2<std::vector<T, Alloc>> : std::true_type { };
并且每个都会在不同的上下文中使用
// 1
is_vector1<std::list>::value;
// 2
template<typename C>
auto func(C const& data) -> typename std::enable_if<is_vector2<C>::value>::type
{ /**/ }
有没有办法让一个版本在两种情况下都可用?
备注
我没有制作基本模板的选项,这是一个可变参数模板,我在 C++11 之前的上下文中工作
可以通过重载函数模板来解决:
template<template<class, class> class T>
typename enable_if<!is_vector1<T>::value, char>::type is_vectorf();
template<template<class, class> class T>
typename enable_if<is_vector1<T>::value, char(&)[2]>::type is_vectorf();
template<typename T>
typename enable_if<!is_vector2<T>::value, char>::type is_vectorf();
template<typename T>
typename enable_if<is_vector2<T>::value, char(&)[2]>::type is_vectorf();
之后,只需添加一个使用sizeof
的简单宏来翻译函数的return类型:
#define is_vector(T) ::std::integral_constant<bool, sizeof(is_vectorf<T>()) != 1>
用法相当明显,但如果它导致从属名称,则可能需要 typename
。可以看到an example here.
请注意,::std::enable_if
、::std::integral_constant
和 ::std::declval
均来自 C++11 标准库,但使用 C++03 模拟它们相当容易。
我想构建能够回答 is_vector
、is_list
等问题的特征。问题是我必须为每个版本制作两个版本,即模板模板参数一:
template<template<class,class> class C>
struct is_vector1 : std::false_type { };
template<>
struct is_vector1<std::vector> : std::true_type { };
和简单模板参数一:
template<class T>
struct is_vector2 : std::false_type { };
template<class T, class Alloc>
struct is_vector2<std::vector<T, Alloc>> : std::true_type { };
并且每个都会在不同的上下文中使用
// 1
is_vector1<std::list>::value;
// 2
template<typename C>
auto func(C const& data) -> typename std::enable_if<is_vector2<C>::value>::type
{ /**/ }
有没有办法让一个版本在两种情况下都可用?
备注
我没有制作基本模板的选项,这是一个可变参数模板,我在 C++11 之前的上下文中工作
可以通过重载函数模板来解决:
template<template<class, class> class T>
typename enable_if<!is_vector1<T>::value, char>::type is_vectorf();
template<template<class, class> class T>
typename enable_if<is_vector1<T>::value, char(&)[2]>::type is_vectorf();
template<typename T>
typename enable_if<!is_vector2<T>::value, char>::type is_vectorf();
template<typename T>
typename enable_if<is_vector2<T>::value, char(&)[2]>::type is_vectorf();
之后,只需添加一个使用sizeof
的简单宏来翻译函数的return类型:
#define is_vector(T) ::std::integral_constant<bool, sizeof(is_vectorf<T>()) != 1>
用法相当明显,但如果它导致从属名称,则可能需要 typename
。可以看到an example here.
请注意,::std::enable_if
、::std::integral_constant
和 ::std::declval
均来自 C++11 标准库,但使用 C++03 模拟它们相当容易。