首页
学习
活动
专区
工具
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)内对应位置数据。...其他参数个数实现方法类似,这里就不一一截图列举了。 这么实现还有个好处,就是如果使用了过大占位,在调用时候由于参数个数不对,就会被编译器检测出来并报错。

97930

【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++ 接口

65920

C++20新特性个人总结

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

1.8K50

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...通常情况下,模板可以帮我们实现一些与类型无关代码,但在某些场景中,【泛】无法满足调用方精准需求,此时会引发错误,比如使用 日期类对象指针 构建优先级队列后,若不编写对应仿函数,则比较结果会变为未定义

15510

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.2K20

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.5K63

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

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

18450

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.3K30

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推演出参数错误,对这种模板函数可以用显示模板实参来解决...,也就是说如果编译器不能自动判断时候这个就是必要

53920

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.1K00

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.3K10

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

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

70210

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。

15010

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

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

6110

【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 函数

13410

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....本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

75010

C++:模版进阶 | Priority_queue模拟实现

一、非类型模版参数 模板参数分类为类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类参数类型名称。...非类型形参,就是用一个常量作为类(函数)模板一个参数,在类(函数)模板中可将该参数当成常量来使用。 注意: 非类模板参数必须在编译期就能确认结果。...二、模版特化 通常情况下,使用模板可以实现一些与类型无关代码,但对于一些特殊类型可能会得到一些错误结果,需要特殊处理,比如:实现了一个专门用来进行小于比较函数模板 可以看到...并且这种函数实现简单明了,代码可读性高,容易书写,因为对于一些参数类型复杂函数模板,特化时特别给出,因此函数模板建议特化。...一般比较推荐使用这种。 方法二:模板定义位置显式实例化。这种方法不实用,推荐使用。 显式实例化意思就是,你不是推断不出来吗??那我就直接告诉你要生成什么样函数!

9810

C++17常用新特性

2 C++17新特性 2.1 折叠表达式 从C++17开始,可以使用二元操作对形参包中参数进行计算,这一特性主要针对可变参数模板进行提升,可以分为左折叠和右折叠。支持二元操作多达32个。...return 0; } 运行结果: sum1=6 sum2=16 2.2 类模板实参推导 对模板进行实例化时,不需要指定模板参数,编译器会根据传入实参进行类型推导。...Foo,其中 T // 是独有的 lambda 类型 2.3 用auto作为非类模板参数...在模板参数使用auto作为关键字时,模板实例化传入非类型值,auto可以推导出参数类型。...::cout<<"sum1="<<sum1<<<em>std</em>::endl; return 0; } 代码运行结果为:3; 需要注意<em>的</em>是C++17目前还不支持<em>参数</em>类型是浮点<em>型</em><em>的</em>推导。

2.1K20
领券