首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不使用非类型模板参数实现std::bind的占位符?

非类型模板参数是指模板参数的值必须在编译时确定,并且只能是整型、枚举类型或指向对象的指针类型。而std::bind的占位符是在运行时根据函数调用的参数来确定的,因此无法使用非类型模板参数来实现std::bind的占位符。

std::bind是C++标准库中的一个函数模板,用于将函数对象与其参数绑定,并生成一个新的可调用对象。它可以用于实现函数的柯里化、参数重排、参数绑定等功能,非常灵活和强大。

使用非类型模板参数实现std::bind的占位符是不可行的,原因如下:

  1. 非类型模板参数必须在编译时确定,而std::bind的占位符是在运行时根据函数调用的参数来确定的。因此,无法使用非类型模板参数来表示占位符的位置。
  2. std::bind的占位符可以在函数调用时根据参数的位置进行绑定,例如_1表示第一个参数,_2表示第二个参数,以此类推。而非类型模板参数无法表示参数的位置,只能表示参数的值。
  3. 使用非类型模板参数实现std::bind的占位符会导致代码的可读性和可维护性降低。非类型模板参数的值必须在编译时确定,而std::bind的占位符的值是在运行时确定的,这样会导致代码逻辑混乱,难以理解和调试。

综上所述,使用非类型模板参数实现std::bind的占位符是不可行的。在C++中,可以使用std::placeholders命名空间中定义的占位符来实现std::bind的占位符功能。例如,_1表示第一个参数,_2表示第二个参数,以此类推。这样可以更加灵活地进行参数绑定和函数调用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

std和boostfunction与bind实现剖析

用过std和boostfunction对象和bind函数童鞋们都知道这玩意用起来腰不酸了,腿疼了,心情也舒畅了。...如何控制调用时占位位置和区分占位与传入参数? 首先,需要知道是,bind函数返回是一个叫bind_t模板类。并且这是个可调用对象(重载了operator()操作)。...图7: Boost 1.55.0 bind执行流程略图 执行流程解决了,最后就剩第三个问题,如何控制调用时占位位置和区分占位与传入参数。...首先是成员函数重载实现占位取相应数据。这里面 **boost::arg到boost::arg**分别是占位。如果是占位,就会返回参数列表(也就是新list)内对应位置数据。...其他参数个数实现方法类似,这里就不一一截图列举了。 这么实现还有个好处,就是如果使用了过大占位,在调用时候由于参数个数不对,就会被编译器检测出来并报错。

1K30

【Example】C++ Template (模板)概念讲解及编译避坑

C++ 不同于 Java,它没有标准 Object 类型。也就意味着 C++ 并不存在完整编程概念。 先讲 “部分” 泛编程概念实现方式:模板。 什么是模板?...然后:类模板当中非类型形参 这是一个什么东西呢? 1,它是一个常量。 2,它类型只能是 int 、指针、引用这三种内置类型。 3,调用它只能是一个常量表达式。 它使用场景?...> 3,模板与完整泛编程区别(编译避坑) C++ 模板类在没有被使用之前,编译器完全不知道它会占用多少空间!...而 C++ 每一个变量及对象占用空间在编译时候就要被确定! 所以 C++ 当中没有绝对编程概念。 因此,模板类必须是声明与实现同源(不一定是文件不分离),最合适写法也就是 hpp 文件。...::function 与 std::bind 【Example】C++ 运算重载 【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr 【Example】C++ 接口

71720
  • C++20新特性个人总结

    ,新增自定义查找规则  2.17  放宽基于范围for循环,新增自定义范围方法  2.18  类类型非类模板参数  关于类类型非类模板参数优化  类类型非类模板参数条件(满足任意一个)...  聚合初始化推导类模板参数  2.28  隐式地将返回本地变量转换为右值引用  2.29  允许default修饰运算按值比较  2.30  非类模板参数等效条件  3  宏  4  属性 ...  比较拗口,放松了非类模板参数限制,可以用类类型作为模板参数,但是条件是所需要运算需要在编译期完成。 ...(满足任意一个):  ①字面量  ②是一个lvalue  ③包含占位类型  ④派生类类型一个占位  ⑤拥有强结构可比较性,没有mutable或者volatile修饰子对象,拥有声明为public...非类模板参数等效条件  相同类型两个值,模板参数等效条件(之一):  ①整型且值相同;  ②浮点类型且值相同;  ③是std::nullptr_t类型;  ④枚举类型,且枚举值相同;  ⑤指针类型

    1.9K50

    std和boostfunction与bind实现剖析

    用过std和boostfunction对象和bind函数童鞋们都知道这玩意用起来腰不酸了,腿疼了,心情也舒畅了。...如何控制调用时占位位置和区分占位与传入参数? 首先,需要知道是,bind函数返回是一个叫bind_t模板类。并且这是个可调用对象(重载了operator()操作)。...[](p938_08.png) 图8: Boost 1.55.0 内bind模块list去参数实现示例 从图中可以看出来,取参数实现也相当简单。首先是成员函数重载实现占位取相应数据。...而这里传入数据都是由原保存数据list内容,也就是执行bind函数时传入东东。 这就用非常简洁地实现了任意控制占位和预先传入参数。其他参数个数实现方法类似,这里就不一一截图列举了。...这么实现还有个好处,就是如果使用了过大占位,在调用时候由于参数个数不对,就会被编译器检测出来并报错。

    1.8K10

    C++【模板进阶】

    、Date 等,模板参数除了可以匹配类型外,还可以匹配常量(非类型),完成如数组、位图等结构大小确定 1.1、使用方法 在定义模板参数时,不再使用 class 或 typename,而是直接使用具体类型...,就会引发报错 //浮点,非标准 template class arr4 { /*……*/ }; 因此可以总结出,非类模板参数 使用要求为 只能将 整型家族...1.3、实际例子:array 在 C++11 标准中,引入了一个新容器 array,它就使用非类模板参数,为一个真正意义上数组,这个数组是用来对标传统数组 注意: 部分老编译器可能不支持使用此容器...array 第二个模板参数就是 非类模板参数 #include #include #include using namespace std...通常情况下,模板可以帮我们实现一些与类型无关代码,但在某些场景中,【泛】无法满足调用方精准需求,此时会引发错误,比如使用 日期类对象指针 构建优先级队列后,若不编写对应仿函数,则比较结果会变为未定义

    16410

    boost::bind和boost::function使用示例

    boost利器之bind和function使用示例.pdf C++11已支持bind和function,之前不支持,但可以借助boost达到同样目的。...1) boost::function 它模板参数为函数原型,格式为:函数返回类型 (参数列表),其中类型还可以为模板。...2) boost:bind 它可以带多个参数,第一个参数总是为函数地址,如果为非类成员函数,则后面跟参数列表,如果是类成员函数,则第二个参数为类对象地址。...其中“_1”和“_2”等,表示参数占位,对应于boost::function中函数原型参数列表。像“fs”和“R_OK | W_OK | X_OK”,一看就知道是咋回事。...有人说可以用它来替代C++中虚拟函数,而且比虚拟函数更优雅,但我这么认同,实际工作中,常常两者结合使用,以达到简化代码目的。

    1.3K20

    C++ 学习笔记

    C 4) > c; // ok } 3.4 用 auto 作为非模板类型参数类 1.从 C++17 开始,可以指定非类模板参数具体类型(代之以 auto...::cout << "lambda called for: " << i << std::endl;}); } 11.2 其它实现工具 标准库中提供了丰富多样 type traits 工具,使用时一定要注意类型萃取精确定义...函数模板 std::declval()可以被用作某一类对象引用占位。 // 避免在调用运算?...::forward(val)); } 11.4 其它实现工具 模板参数 T 类型可能被推断为引用类型,此时可能会引起意料之外错误。...undefined undefined 18.6 泛编程 十九、萃取实现 19.1 序列求和示例 简单求和模板函数定义及使用如下: template T accum (T

    6.7K63

    CC++开发基础——类模板

    ,可以直接使用模板名称,不需要显式地带模板参数,因此,在类模板内部,Array和Array等价。...但是在模板外部定义成员函数,语法与普通类不同,需要将成员函数定义为函数模板。 由于成员函数函数模板与它们模板绑定在一起,所以函数模板使用参数列表必须与类模板参数列表完全相同。...{10}; //定义了一个对象,会创建类模板实例,同时还会生成构造函数函数模板实例 三,非类模板参数 非类参数是指模板定义中,带有指定类型参数。...,给非类参数传不同实参,将生成不同模板实例。...当有些模板参数只适用于特定数据类型,比如可以使用string类型实例化模板,但使用char*类型实例化模板时会报错,此时需要定义类模板特例。

    19950

    C++模板总结

    模板是 C++ 支持参数化多态工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中某些数据成员或者成员函数参数、返回值取得任意类型。...而当 swap(c,d) 其中 c 和 d 是 double 类型时,模板函数会被替换为 swap(double &a, double &b),这样就实现了函数实现与类型无关代码。...也就是说不能把整型值 2 推演为 int 传递给模板形参。要把类模板形参调置为 int 必须这样指定 A m。...9、非类型形参一般不应用于函数模板中,比如有函数模板 template void h(T b){} ,若使用 h(2) 调用会出现无法为非类型形参 a 推演出参数错误,...,也就是说如果编译器不能自动判断时候这个就是必要

    1.2K20

    【Example】C++ 回调函数及 std::function 与 std::bind

    3,拟写符合函数指针类型实现函数,将实现函数指针作为参数传递给使用函数。...如果代码中混杂着大量普通函数、模板函数、lambda,使用 std::function 是非常有必要。...它与 std::function 不同是,function 是模板类,bind模板函数,而 bind 返回可调用对象可以直接给 function 进行包装并保存。...为什么要进行“包装”与“转发”呢? 首先,规范解释是,function 作用是包装,它可以包装类成员函数,但却无法生成类成员函数可调用对象。而 std::bind 则是可以生成。...3,允许同一 bind 表达式中多重占位(例如多个 _1 ),但结果仅若对应参数( u1 )是左值或不可移动右值才良好定义。

    4.7K30

    C++模板大总结!

    模板是C++支持参数化多态工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中某些数据成员或者成员函数参数、返回值取得任意类型。...而当swap(c,d)其中c和d是double类型时,模板函数会被替换为swap(double &a, double &b),这样就实现了函数实现与类型无关代码。...也就是说不能把整型值2推演为int 传递给模板形参。要把类模板形参调置为int 必须这样指定A m。...9、非类型形参一般不应用于函数模板中,比如有函数模板template void h(T b){},若使用h(2)调用会出现无法为非类型形参a推演出参数错误,对这种模板函数可以用显示模板实参来解决...,也就是说如果编译器不能自动判断时候这个就是必要

    63920

    C++核心准则编译边学-F.19 对于只传递处理参数使用模板类型TP&&并在传递时使用std::forward

    F.19: For "forward" parameters, pass by TP&& and only std::forward the parameter(对于只传递处理参数使用模板类型TP...如果对象不在本函数内部使用而是继续传递给其他代码,我们希望本函数不会改变参数常数特性和右值特性。...在这种情况下,也只有在这种(右值引用参数只传递不使用)情况下,将TP参数定义为TP&&(这里TP是模板类型)--这样可以无视并维持常量特性和右值特性。...TP&&类型参数本质上总是应该在函数体中通过std::forward继续传递。 译者注:最终还是要被某段代码作为左值使用。...在下面情况下发出警示:对于函数使用TP&&类型参数(这里TP是模板类型参数名),除了在所有静态路径上精确地执行一次std::forward操作以外执行了任何(针对改参数)其他处理。

    1.2K00

    C++ 新特性学习(四) — Bind和Function

    这就是传说中绑定库和增强函数对象 接下来一个一个来 Bind 可用于绑定函数、成员函数、函数对象、成员变量 这是老标准中std::bind1st和std::bind2nd增强版,这两个函数只能且必须绑定一个带有两个参数...std::placeholders::_1是占位,表示调用时第一个参数,这段代码里表示x 如果代码是std::bind(f, std::placeholders::_2, std::placeholders...(特别注意是绑定类成员时遗漏类实例) 绑定参数类型匹配将会在调用时编译错误 占位匹配将会在调用时编译错误 绑定对象必须是函数或成员函数指针 绑定对象默认为c++函数且不支持变长参数函数,...10个占位,而G++支持30个占位 Function 这东西是针对函数对象多态包装器(又称多态函数对象包装器),函数对象又称仿函数。...std::function同样支持函数、成员函数、函数变量和函数结构。 std::function和std::bind配合使用时是把std::bind返回结果作为函数对象使用

    2.4K10

    C++为什么参数依赖查找(ADL)?

    这个过程包括非限定名称查找和限定名称查找,以及在需要时参数依赖查找和模板参数推导:非限定名称查找(Unqualified name lookup):当使用未限定名称时(如std),编译器会在全局或命名空间作用域内查找该名称声明...对于函数和函数模板名称,名称查找可以将多个声明与同一名称关联起来,并且可能从参数依赖查找中获得额外声明(模板参数推导也可能适用),这一组声明集被传递给重载解析,来选择最终要使用声明。...c 代码解读复制代码// 要访问被隐藏类型名称,你必须使用详细类型说明(elaborated type specifier)。这通常涉及到使用作用域运算::来指定完整类型名称。...为什么C++会有ADL为什么在限定名称查找和非限定名称查找之外,C++还要提供参数依赖查找这样机制呢?...支持泛编程:在模板编程中,ADL使得模板能够使用模板参数类型相关特定操作,而无需程序员显式地指定这些操作命名空间。这使得模板更加通用和灵活。

    9710

    C++17, 语言核心层变化更多细节

    ,借助auto,函数模板和(类模板)构造函数模板参数可以根据其参数自动进行类型推导(细节介绍),非类模板参数类型也可以从参数中自动推导出来.下面我就来介绍一下非类模板参数自动类型推导....非类模板参数(non-type template parameters)自动类型推导 首先要说明一下哪些属于非类模板参数:他们是 nullptr, 整型, 左值引用, 指针 以及 枚举类型.下面的讲解主要以整型为主...auto, 编译器便可以自动推导非类模板参数(第1行代码中 N)类型了,你甚至可以像示例代码中那样(第7和第8行)偏特化该模板(示例代码中为int类型进行了偏特化).第13行代码模板会依据原始模板...一般类型修饰也可以用在非类模板参数上,所以很多时候,你不必非得使用模板偏特化来限制非类模板参数类型. template struct S; 上述代码中, p...,而 TypeVariadicTemplate 模板(第7行至第11行)则仅会自动推导第一个非类模板参数类型,其余非类模板参数类型都与第一个非类模板参数类型相同.

    73810

    C++之std::function、std::bind、lambda特性

    unsetunsetstd::bindunsetunset std::bind 是 C++11 标准库中一个函数模板,用于创建一个可调用对象(函数对象或函数指针),并绑定到指定参数。...下面是 std::bind 主要特点和用法: 延迟函数调用:std::bind 允许我们在创建可调用对象时立即调用函数,而是将函数对象和参数绑定起来,以便在稍后时间点进行调用。...部分应用函数:std::bind 允许我们在创建可调用对象时只绑定部分参数,剩余参数可以在稍后调用中提供,从而实现函数部分应用。...支持占位std::bind 支持占位std::placeholders::_1、std::placeholders::_2 等),用于指示在调用时提供参数位置。...,我们使用 std::bind 将函数对象 myObject 绑定到参数,并创建了两个可调用对象 func1 和 func2。

    57010

    模板进阶:特化与编译链接全解析

    非类模板 模板参数分为:类型形参和非类型形参 类型形参 类型形参,即在模板初阶中所用例如class A或typename A此类参数类型,跟在class或typename后。...[C++] 模版初阶-CSDN博客 非类模板参数 非类模板参数,就是用一个常量作为类(函数)模板一个参数,在类(函数)模板中可将该参数当成常量来使用,定义方法如下: template<class...浮点数、类对象以及字符串是不允许作为非类模板参数非类模板参数必须在编译期就能确认结果(原因看下文)。...模板特化 为什么要有模板特化 模板技术提供了强大编程能力,使得我们能够编写与数据类型无关代码,从而提高代码复用性和灵活性。...模板匹配顺序:编译器在选择模板实例化时,会按照以下优先顺序进行匹配: 完全匹配全特化(优先级最高) 最匹配偏特化 最通用模板 指针特化时const修饰问题 为什么参数列表使用const

    13910

    【C++进阶】模板进阶与仿函数:C++编程中与函数式编程思想

    这种灵活性使得仿函数在代码复用、状态保存以及STL算法中使用等方面具有广泛应用价值 > 1. 非类模板参数 模板参数分类类型形参与非类型形参。...非类型形参,就是用一个常量作为类(函数)模板一个参数,在类(函数)模板中可将该参数当成常量来使用 我们在之前学所有模板基本上都是类型形参,也就是你传什么,他就用什么,而非类型形参则是相当于固定了一个模板参数类型...使用arr ... return 0; } 注意: 浮点数、类对象以及字符串是不允许作为非类模板参数 非类模板参数必须在编译期就能确认结果 2....0; } 注意:一般情况下如果函数模板遇到不能处理或者处理有误类型,为了实现简单通常都是将该函数直接给 出,参数类型复杂函数模板建议特化!...在默认情况下,类模板会为所有类型提供通用实现,但有时候,我们可能希望对某些特定类型提供不同实现。这时,就可以使用模板特化来实现 全特化 全特化是针对类模板所有模板参数提供专门定义。

    11810

    【C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 )

    一、函数适配器简介 1、函数适配器概念 在 STL 中 预定义了很多 函数对象 , 如果要 对 函数对象 参数 / 返回值 进行 计算 或 设置 , 可以 使用 " 函数适配器 " 实现上述需求 ;.../ 函数指针 / 成员函数 / 成员函数指针 / 函数对象 / 谓词 等可调用对象 ; Args&&… args 参数 : 这是一个可变参数 , 参数可以是值 , 引用 或者 占位 ; 返回值解析...: 返回是一个未指定类型 , 这个类型是一个函数对象 , 可以像普通函数那样被调用 ; 当返回函数对象被调用时 , 它会用提供参数std::bind占位来调用 fn ; 占位...是 std::placeholders::_1 , std::placeholders::_2 等值 ; 如果 参数中是 std::placeholders::_1 占位 , 表示 第一个 参数 ,...不进行修改 , 仍然保持其默认值 ; std::placeholders::_2 占位 , 表示 第二个 参数 , 不进行修改 , 仍然保持其默认值 ; 2、代码示例 - std::bind 函数

    17910

    c++ 11 bind_箭头函数可以用bind

    大家好,又见面了,我是你们朋友全栈君。 bind函数使用详解 可以将bind函数看作是一个通用函数适配器,它接受一个可调用对象,生成一个新可调用对象来“适应”原对象参数列表。...arg_list中参数可能包含形如_n名字,其中n是一个整数,这些参数是“占位”,表示newCallable参数,它们占据了传递给newCallable参数“位置”。...a+b; } int main() { //表示绑定函数plus 参数分别由调用 func1 第一,二个参数指定 function func1 = std::bind...cout<<func2(1,2)<<endl; //3 retunrn 0; } 占位_1位于placeholders命名空间,而placeholders位于std命名空间中 3....本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    76910
    领券