"c++ 的模板-6ren"> "c++ 的模板-我正在寻找一种方法来提供采用模板化 (STL) 容器的函数,但要求其元素属于特定类型(例如 int)。 这些函数调用应该是有效的: std::vector Argument; void foo( Ar-6ren">
gpt4 book ai didi

c++ - "AnySTLContainer"c++ 的模板

转载 作者:可可西里 更新时间:2023-11-01 15:36:53 28 4
gpt4 key购买 nike

我正在寻找一种方法来提供采用模板化 (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
}

Live demo

注意:

  • 如果 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com