作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
"c++ 的模板-6ren"> "c++ 的模板-我正在寻找一种方法来提供采用模板化 (STL) 容器的函数,但要求其元素属于特定类型(例如 int)。 这些函数调用应该是有效的: std::vector Argument; void foo( Ar-6ren">
我正在寻找一种方法来提供采用模板化 (STL) 容器的函数,但要求其元素属于特定类型(例如 int
)。
这些函数调用应该是有效的:
std::vector<int> Argument;
void foo( Argument );
std::list<int> Argument
void foo( Argument );
std::deque<int> Argument
void foo( Argument );
...etc
这些函数调用应该是无效的:
std::vector<float> Argument;
void foo( Argument );
std::list<double> Argument
void foo( Argument );
std::deque<char> Argument
void foo( Argument );
...etc
有没有一种方法可以对“foo”进行模板化,以便接受 int
的容器,但不接受具有不同元素类型的容器?
最好的,本
最佳答案
使用标准库语义:
foo
,而不是容器:它使您的函数更更通用std::iterator_traits<Iterator>::value_type
获取值类型static_assert
Iterator 的值类型为 int
(或任何你想要的类型)示例:
#include <list>
#include <vector>
template<typename Iterator>
void foo(Iterator begin, Iterator end)
{
static_assert(std::is_same<int, typename std::iterator_traits<Iterator>::value_type>::value,
"Invalid value type : must be int");
}
int main() {
std::list<int> l1;
std::vector<int> v1;
foo(std::begin(l1), std::end(l1)); // OK
foo(std::begin(v1), std::end(v1)); // OK
std::vector<float> v2;
foo(std::begin(v2), std::end(v2)); // Doesn't compile
}
注意:
foo
需要访问容器的特定成员函数(如 Deduplicator 所述,这可能是出于性能原因),那么您可能需要坚持使用 Container
参数:示例:(注意获取 value_type
的区别,正如 MooingDuck 所指出的,这是使其与数组一起工作所必需的):
template <typename Container>
void foo(const Container& c)
{
static_assert(std::is_same<int, std::iterator_type<decltype(std::begin(c))>::value_type>::value, "Invalid value type : must be int");
// Use c member function(s)
}
关于c++ - "AnySTLContainer<int>"c++ 的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25413671/
我正在寻找一种方法来提供采用模板化 (STL) 容器的函数,但要求其元素属于特定类型(例如 int)。 这些函数调用应该是有效的: std::vector Argument; void foo( Ar
我是一名优秀的程序员,十分优秀!