繁体   English   中英

包含某些对象的STL容器模板参数

[英]STL container template parameter containing certain object

我有一个函数f

template <typename T>
void f(T<int> ints)
{ /* */ }

该函数应该采用std::vector<int>std::initializer_list<int>或任何其他STL容器,但仅限于包含int

我可以接受其他classint class es作为模板参数,但是我不希望它接受std::vector<char>std::vector<double>std::list<double>像这样。

我怎么能意识到这一点?

可以使用模板template参数:

template <template <typename...> typename T>
void f(const T<int>& ints)
{ /* */ }

但我建议改为使用容器的value_type类型成员。 这样可以避免将其他模板与int作为模板参数进行匹配。

//using std::enable_if_t
template <typename T>
std::enable_if_t<std::is_same<typename T::value_type, int>::value> 
f(const T& ints)
{ /* */ }

//or static_assert
template <typename T>
void f(const T& ints) { 
    static_assert(std::is_same<typename T::value_type, int>::value,
                  "T must be a container of ints"); 
    //...
}

徒劳地,这是从中实例化功能的功能模板。

一种解决方案是检测标准容器提供的value_type

template<class T>
typename std::enable_if<std::is_same<int, typename T::value_type>::value>::type
void f(T const& ints);

但是,这对于内置数组将不起作用,因为它们没有嵌入的value_type 对于内置数组,您可以添加一个重载:

template<size_t N>
void f(int const(&ints)[N]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM