统一容器特征

时间:2015-03-23 10:57:48

标签: c++ template-meta-programming typetraits

我想建立能够回答is_vectoris_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上下文中工作

1 个答案:

答案 0 :(得分:3)

您可以通过重载功能模板来解决它:

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的简单宏来转换函数的返回类型:

#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模拟它们相当容易。

相关问题