| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1897 人关注过本帖, 1 人收藏
标题:关于initializer_list的应用
只看楼主 加入收藏
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
结帖率:93.75%
收藏(1)
 问题点数:0 回复次数:5 
关于initializer_list的应用
    正在看《C++Primer 5e》学习。
C++11标准新加了一个用于处理不同数量实参的函数的方法,就是使用initializer_list类型的形参来做这个处理。
    我凭着自己的理解写了一段简短程序进行验证。但是调用该函数的时候出现类型不匹配的错误:不能把int类型的“1”转换为initializer_list《int》类型。
请问我应该如何改写第15行函数调用处的代码?
还是说这个东西只能用于类类型的构造时使用
(我注意到http://有一句话,“initializer_list对象只能用大括号{}初始化。”),我必须用{}花括号进行传参的时候才可以使用。像现在的写法因为是函数调用,用的小括号,不能被识别为initializer_list类型。
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
#include<stdio.h>
#include<malloc.h>
#include <initializer_list>


int Max(std::initializer_list<int> a){
    int max=*a.begin();
    for(auto k:a){
        if(k>max)max=k;
        printf("%d",k);
    }
}


int main() {
printf("{%d}",Max(1,2,3,4));
   

    return 0;
}







2016-10-27 11:06
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
已解决。
程序代码:
#include<stdio.h>
#include<malloc.h>
#include <initializer_list>


int Max(std::initializer_list<int> a){
    int max=*a.begin();
    for(auto k:a){
        if(k>max)max=k;
        printf("%d,",k);
    }
    return max;
}


int main() {
printf("{%d}",Max({1,2,3,4,5,6}));//原来在这里加上花括号就行了。。。

   

    return 0;
}





φ(゜▽゜*)♪
2016-10-27 11:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
嫌花括号不美观的话,可以再包装一下

程序代码:
#include <iostream>
#include <algorithm>
using namespace std;

template<typename... T>
auto Max( const T& ...t )
{
    return std::max( {t...} );
}

int main( void )
{
    std::cout << Max( 1.2, 3.4, 5.6 ) << std::endl;
    std::cout << Max( 1, 3, 2 ) << std::endl;
}



[此贴子已经被作者于2016-10-28 08:12编辑过]

2016-10-27 14:49
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 3楼 rjsp
我看书上说initializer_list类型和vector类似,定义该类对象时必须说明列表中所含元素的类型。
图片附件: 游客没有浏览图片的权限,请 登录注册

经我自行测试vector<auto> k={1,2,3,4};是不合法的定义。所以我推测initializer_list<auto>应该也是不行的。
而您的代码貌似没看到initializer_list,只使用了省略符形参。而参照书本和  http://  等文章,我觉得省略符后面是不应该再跟变量名称的。
基于这些,我觉得您的省略号部分应该也是缩写了一些什么。inititlizer_list不能实现int/float/double等多类型交叉的“可变形参”。是别的什么吗?
如果可以提供一个参考链接、或者可用于搜索百科之类的关键词。谢谢!

φ(゜▽゜*)♪
2016-10-27 17:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
vector<auto> k={1,2,3,4};不合法
在最新的C++17中,可以写成 vector k={1,2,3,4};
当然这是题外话

std::max 可以接受 initializer_list
因此我将参数们组成initializer_list传给它
我用的不是 可变函数参数列表,而是 可变模板参数列表
2016-10-27 18:59
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
我在三楼的代码怎么少了东西

#include <iostream>
#include <algorithm>
using namespace std;

template<typename... T>
auto Max( const T& ...t )
{
    return std::max( {t...} );
}

int main( void )
{
    std::cout << Max( 1.2, 3.4, 5.6 ) << std::endl;
    std::cout << Max( 1, 3, 2 ) << std::endl;
}


[此贴子已经被作者于2016-10-27 19:19编辑过]

2016-10-27 19:09
快速回复:关于initializer_list的应用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019790 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved