gpt4 book ai didi

c++ - 接受 STL_container_type::iterator 的模板化参数

转载 作者:可可西里 更新时间:2023-11-01 18:35:11 26 4
gpt4 key购买 nike

我有一个函数,其中有一个包含字符串的容器(例如 vector<string>set<string>list<string> ),并且给定一个开始迭代器和一个结束迭代器,通过迭代器范围处理字符串。

目前函数声明如下:

template< typename ContainerIter>
void ProcessStrings(ContainerIter begin, ContainerIter end);

现在这将接受任何符合实现 operator* 的隐式接口(interface)的类型, 前缀 operator++以及函数体中的任何其他调用。

我真正想做的是像下面这样明确限制输入量的定义(伪代码警告):

template< typename Container<string>::iterator>
void ProcessStrings(Container<string>::iterator begin, Container<string>::iterator end);

这样我就可以这样使用它了:

vector<string> str_vec;
list<string> str_list;
set<SomeOtherClass> so_set;

ProcessStrings(str_vec.begin(), str_vec.end()); // OK
ProcessStrings(str_list.begin(), str_list.end()); //OK
ProcessStrings(so_set.begin(), so_set.end()); // Error

本质上,我想做的是限制函数规范,让函数的用户清楚地知道它接受什么,如果代码编译失败,他们会收到一条消息,说他们使用了错误的参数类型,而不是在函数体中找不到 XXX 类的 XXX 函数。

最佳答案

您可以使用模板模板参数接近这一点:

template<template<class> class CONTAINER>
void ProcessStrings(CONTAINER<string>&);

这将处理整个容器,如果它不包含字符串则给出编译错误。

ProcessStrings(str_vec); // OK
ProcessStrings(so_set); // Error

如果你想使用迭代器范围,那么我能管理的最好的是

template<template<class> class CONTAINER>
void ProcessStrings(typename CONTAINER<string>::iterator,
typename CONTAINER<string>::iterator);

不幸的是,类型推断不适用于函数参数,因此您必须显式提供模板参数:

ProcessStrings<vector>(str_vec.begin(), str_vec.end()); // OK
ProcessStrings<set>(so_set.begin(), so_set.end()); // Error

有人可以改进吗?

关于c++ - 接受 STL_container_type<string>::iterator 的模板化参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2922328/

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