热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从参数的返回类型中推断类型

如何解决《从参数的返回类型中推断类型》经验,为你挑选了1个好方法。

我理解模板不能从赋值中推断出类型,即

template 
T aFunction (int a) { /*...*/ }; // This obviously won't work

而且很明显为什么.但这奏效:

template 
T aFunction (T a, T b) { return a + b; }; // a-ok

原因T将从论证中推断出来.我想从中推断一下:

template 
T aFunction (std::function a) { return a(3);};
                           ^
                           |
  I specified it! ----------

所以当使用时,函数应该做什么没有歧义:

std::function blah = [](int x){ return x / 2.0f; };
aFunction(blah);

唉,编译器不会与我合作:

调用'aFunction'没有匹配的成员函数

候选模板被忽略:无法匹配'function'与'(lambda at file.hpp:274:16)'

有没有办法让这种情况发生?缺少模板特化(这是一个非常通用的类),或者是一个虚拟参数(我不是那么绝望).


PD:

完全披露:以上只是问题的简化,正是我需要的是:

template 
class MyStuff {

    template 
    MyStuff aFunction(std::function a){ 
        /*for each stuff in MyStuff do a(stuff)*/ 
    }
}

其中MyStuff包含类型的属性T和一堆inline函数,例如aFunction.



1> skypjack..:

如评论中所述,这有效:

#include 

template 
struct MyStuff {
    template 
    MyStuff aFunction(std::function a){ 
        return {};
    }
};

int main() {
    MyStuff stuff;
    std::function fn = [](int) { return 0.; };
    stuff.aFunction(fn);
}

相反,这不起作用:

int main() {
    MyStuff stuff;
    stuff.aFunction([](int) { return 0.; });
}

而错误是问题中发布的错误:

注意:候选模板被忽略:无法匹配'function'与'(lambda at main.cpp:15:21)'

原因是类型推导仅适用于确切类型.不允许转换.在你的情况下,编译器应首先推导出lambda的所有返回类型,而不是将其转换为std::function某种方式,最后从使用lambda构造的函数中推导出函数的返回类型.
这不是类型推导的工作原理.

你可以用这样的东西解决它:

template 
struct MyStuff {
    template 
    auto aFunction(F &&f) -> MyStuff(f)(std::declval()))> { 
        return {};
    }
};

在Coliru看到它.


推荐阅读
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • linux 字符串数组初始化,C++字符数组初始化方法的分析
    发现了一个字符数组初始化的误区,而这个往往能导致比较严重的性能问题,分析介绍如下:往往我们在初始化一个字符数组,大概有如下几 ... [详细]
  • YoucanSolveaGeometryProblemtooProblemDescriptionManygeometry(几何)problemsweredesignedinth ... [详细]
  • VS用c语言连接mysql,c语言连接mysql完整演示
    #include#includeintmain(){MYSQL*conn;创建一个指向mysql数据类型的指针connmysql_init(NULL);mysql的初始化if(!c ... [详细]
  • 字符设备驱动leds
    内核版本:4.12.9编译器:arm-linux-gcc-4.4.3本驱动基于jz2440v2开发板,实现3个led设备的驱动程序。代码如下:1#include ... [详细]
author-avatar
晴天逍遥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有