首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用initializer_list替换指针指针

用initializer_list替换指针指针
EN

Stack Overflow用户
提问于 2013-09-03 14:00:17
回答 1查看 112关注 0票数 0
代码语言:javascript
复制
#include <initializer_list>
#include <iostream>
#include <vector>

//this api is anti intuition
void original(int const **data)
{
    for(size_t i = 0; i != 3; ++i){
        int const *ptr = *data;
        //std::cout<<*ptr++<<", "<<*ptr<<std::endl; //this line may cause undefined behavior
        std::cout<<ptr[0]<<", "<<ptr[1]<<std::endl;
        ++data;
    }
}

//my eyes prefer this api than original like api
void replace_original(std::initializer_list<std::initializer_list<int>> list)
{
    std::vector<int const*> results(list.size());        

    for(auto data : list){        
        results.push_back(std::begin(data)); //#1
    }

    original(&results[0]);
}

int main()
{         
    int first[] = {0, 1};
    int second[] = {2, 3};
    int third[] = {4, 5};

    int const *array[] = {first, second, third};
    original(array);
    replace_original({ {0, 1}, {2, 3}, {4, 5} });

    return 0;
}

结果是

代码语言:javascript
复制
0, 1
2, 3
4, 5

预期结果如下

代码语言:javascript
复制
0, 1
2, 3
4, 5
0, 1
2, 3
4, 5

我希望像replace_original这样的api封装原始api (旧的c风格api),但不知道为什么#1不能工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-03 14:27:56

啊,愚蠢的错误,我应该把循环改为

代码语言:javascript
复制
    size_t const size = list.size();
    std::vector<int const*> results(size);
    for(size_t i = 0; i != size; ++i){
        results[i] = std::begin( *(std::begin(list) + i) );
    }

您有更好的解决方案来封装这种api吗?在google之后,我发现在c++14中,initializer_list的size()将成为constexpr,因此我们应该能够使用std::array来替换std::initializer_list。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18594283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档