0
#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;
}

結果は

0, 1
2, 3
4, 5

期待される結果は

0, 1
2, 3
4, 5
0, 1
2, 3
4, 5

replace_original のような API でオリジナルの API (古い、C スタイルの API) をカプセル化したいのですが、なぜ #1 が機能しないのかわかりません。

4

1 に答える 1

0

ああ、ばかげた間違いです。ループを次のように変更する必要があります。

    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::vector を置き換えることができるはずであることがわかりました。

于 2013-09-03T14:27:56.967 に答える