如何将std :: pair的迭代器传递给函数模板,并推导迭代器类型?

如何解决如何将std :: pair的迭代器传递给函数模板,并推导迭代器类型?

我试图将两个迭代器包装到std :: pair中,并将其传递给函数参数,但希望迭代器的类型通用。

它在迭代器类型上模板化的对本身...

template<typename Iterator>
using iteratorPair = std::pair<Iterator,Iterator>;

...然后模板函数本身具有签名...

template<typename T,typename U,template<typename> class IteratorPair,template<typename> class IteratorPairInt>
void
sortUsingIndicesToTargetContainerPair(
    const IteratorPair<T>& rangeToSortSource,const IteratorPair<T>& rangeToSortTarget,const IteratorPairInt<U>& indicesRange)
{ ...}

我正在做所有这些事情,以便可以通过钎焊初始化来调用该函数...

std::vector<int> vecs{0,1,2,3,4,5,6,7,8,9};
std::vector<int> indices{9,0};

auto copy = vecs;
sortUsingIndicesToTargetContainerPair({vecs.begin(),vecs.end()},{copy.begin(),copy.end()},{indices.begin(),indices.end()});

如果我在调用函数时通过使用名称来显式构造类型,则可以使它起作用,但是如果可能的话,希望使用括号初始化。

任何帮助将不胜感激! 谢谢

解决方法

我可以建议以下解决方案。 想法:不要尝试直接推导类型,而是添加一个适配器函数,该函数将参数数组转换为成对的迭代器:

template<typename T,typename TIndex,std::size_t N>
constexpr void FAdaptor
(
    const T(&rangeToSortSource)[N],const T(&rangeToSortTarget)[N],const TIndex(&indicesRange)[N]
)
{ 
  static_assert(2 == N,"must be pair");    
  
  sortUsingIndicesToTargetContainerPair
  (
    IteratorPair<T>(rangeToSortSource[0],rangeToSortSource[1]),IteratorPair<T>(rangeToSortTarget[0],rangeToSortTarget[1]),IteratorPair<TIndex>(indicesRange[0],indicesRange     [1])
  );  
}

完整示例:

#include <iostream>
#include <initializer_list>
#include <vector>
#include <utility>

template<typename Iterator>
using IteratorPair = std::pair<Iterator,Iterator>;


template<typename T,typename TIndex>
void sortUsingIndicesToTargetContainerPair
(
    const IteratorPair<T>& rangeToSortSource,const IteratorPair<T>& rangeToSortTarget,const IteratorPair<TIndex>& indicesRange)
{ 
    
}

template<typename T,std::size_t N>
constexpr void sortUsingIndicesToTargetContainerPair2
(
    const T(&rangeToSortSource)[N],indicesRange     [1])
  );  
}


int main() {
  std::vector<int> vecs{0,1,2,3,4,5,6,7,8,9};
  std::vector<int> indices{9,0};

  auto copy = vecs;
  sortUsingIndicesToTargetContainerPair(std::make_pair(vecs.begin(),vecs.end()),std::make_pair(copy.begin(),copy.end()),std::make_pair(indices.begin(),indices.end()));

  sortUsingIndicesToTargetContainerPair2({vecs.begin(),vecs.end()},{copy.begin(),copy.end()},{indices.begin(),indices.end()});
 
  std::cout << "ok\n";
  return 0;
}
,

如果您已经定义了iteratorPair<Iterator>,则不需要template<typename> class IteratorPair

我还建议按值采用(成对的)迭代器。您是否通过const引用获取(成对的)指针?

template<typename T,typename U>
void sortUsingIndicesToTargetContainerPair(
    iteratorPair<T>& rangeToSortSource,iteratorPair<T>& rangeToSortTarget,iteratorPair<U>& indicesRange);
,

您有几个问题:

  • 71331 62KV 8M01 9R22 1N5350 12345678 123456 没有类型,只能推导为{..}std::initializer_list<T>

  • template参数不能推断出别名为别名,

    T(&)[N](又名iteratorPair<SomeType>)与std::pair<SomeType,SomeType>不匹配。

    我们收到了带有默认模板(template <typename> class Pairstd::vector<T,Allocator /*=SomeDefault<T>*/>)的类似“问题”,该问题已在C ++ 17中解决。我认为对于可能存在“冲突” /重复项的别名,无法解决该问题。

    正如Caleth所提到的,您可能还是不想对此进行推论。

  • 您的template <typename T> Container似乎定义了一个范围,但是您的常量性具有误导性。 iteratorPair允许修改基础容器。使用真正的范围类型似乎更合适。

要允许调用语法,您可以放弃const iteratorPair<std::vector<int>::iterator>并执行以下操作:

std::pair

但是,为了保持对范围的了解,您甚至可以这样做

// SourceIt might be different than TargetIt (iterator and const_iterator mainly)
template <typename SourceIt,typename TargetIt,typename IndexesIt>
void sortUsingIndicesToTargetContainerPair(
    const SourceIt (&rangeToSortSource)[2],const TargetIt (&rangeToSortTarget)[2],const IndexesIt (&indicesRange)[2])
{ /*...*/ }

您甚至拥有更简单的调用语法:

template <typename Source,typename Target,class Indexes>
void
sortUsingIndicesToTargetContainerPair(
    const Source& rangeToSortSource,Target& rangeToSortTarget,/*const*/ Indexes& indicesRange)
{ /*...*/}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-