gpt4 book ai didi

c++ - 如何断言模板参数的类型 STL 迭代器类型

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:58 26 4
gpt4 key购买 nike

假设我想编写通用函数来打印出集合中的标准输出范围。因为它应该是普遍的,我假设......

std::vector<std::string> names = { "John", "Henry", "Mark" };

还有:

std::vector<int> years = { 100, 200, 400 };

.. 将可以打印出来。

由于集合的类型可能不同,并且 STL 集合没有基类让我有机会传递基类迭代器我使用模板函数:

template<typename TIterator>
void PrintRange( TIterator beginIter,TIterator endIter )
{
for( auto it = beginIter; it != endIter; ++it )
{
std::cout << *it << std::endl;
}
}

现在一切正常,现在我可以写:

PrintRange( names.begin(), names.end() );

和:

PrintRange( years.begin(), years.end() );

但现在我想帮助我的函数的客户更快地理解为什么他在使用它时会出错。现在当我打电话时:

PrintRange( 100, 400 );

有错误:

main.cpp:23:34: error: invalid type argument of unary ‘*’ (have ‘int’)

我想打印这样的东西:

One of arguments does not correspond to expected argument of type 'iterator'

那么什么方法最好解决这个问题:

  1. 关心错误信息是否如前所述并不重要如我所料有意义。用户应该分析模板类代码以确定他错误的原因。

  2. 使用 static_assert 断言所有已知的可能性..但是如何断言函数的参数是任何迭代器,因为没有基类?

static_assert( std::is_base_of::iterator >::value );

这只会断言字符串迭代器的 vector ...

最佳答案

就我个人而言,我认为您的第一种方法完全没问题,因此您可能不太关心其他错误消息。

另一方面,如果您决定打印一条有意义的消息,您可以实现一个自定义类型特征来检测迭代器,如解释的那样 here然后将其与 static_assert 一起使用。所以代码转换成类似的东西:

template<typename TIterator>
void PrintRange(TIterator beginIter, TIterator endIter)
{
static_assert(is_iterator<TIterator>::value,
"TIterator is not an iterator type");

for( auto it = beginIter; it != endIter; ++it )
{
std::cout << *it << std::endl;
}
}

关于c++ - 如何断言模板参数的类型 STL 迭代器类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48043199/

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