1

最近、私は「repeat」や「foreach」などの多くの構造を必要とするプロジェクトに取り組んでいました。C++ にはそのような構造がないことはわかっていますが、それらがどのように見えるかを想像してみました。

repeat(count)
{
   ...
}

foreach(someList, it)
{
   ...
}

テンプレート インライン関数は C++ で既にサポートされているため、テンプレート コード ブロックもサポートするために必要な変更はほとんどありません。考えられる構文の 1 つは次のようになります。

template<unsigned count> repeat(unsigned count)
while(count--) __code;

template <class ContainerT, typename ContainerT::iterator it>
foreach(ContainerT& cn, typename ContainerT::iterator it)
    for(typename ContainerT::iterator it=cn.begin(); it!=cn.end(); ++it) __code;

この構文についてどう思いますか? そのような機能が将来の C++ バージョンに追加される可能性はありますか? 現在の C++ バージョンでこのようなものを実装するための回避策を知っていますか?

4

2 に答える 2

3

そのような機能が将来の C++ バージョンに追加される可能性はありますか?

C++11 には範囲ベースのforループがあります。

for (auto elem : cont) // (perhaps use auto&, auto const&, or auto&&,
                       //  depending on your use case)
{
    // Do what you want with elem...
}

std::for_each()または、ラムダで使用できます。

std::for_each(cont.begin(), cont.end(), 
    [&] (decltype(cont)::value_type const& elem)
//                                  ^^^^^^
//                                  Or whatever fits your needs
{
    // Do what you want with elem...
}

また、Boost.Rangeには、反復子のペアではなく範囲で作業できる C++ 標準アルゴリズムのバージョンがあります。

#include <boost/range/algorithm.hpp>

// ...

std::vector<int> v = { 1, 2, 3 };
boost::for_each(v, [] (int i) { std::cout << i * 2 << std::endl; });
于 2013-06-02T13:38:24.557 に答える
1

ループに適切な本体を持たせる代わりに、C++ 標準ライブラリがどのようにそれを行うかを見てください。類似した関数への引数として「述語」を使用し、これらは任意の呼び出し可能なオブジェクト (関数ポインター、静的メンバー関数ポインター、ファンクター オブジェクト、および (C++11以上)std::functionオブジェクト、std::bind式またはラムダ式)。

したがって、repeat関数は次のようになります。

template<typename Tpred>
void repeat(unsigned count, Tpred predicate)
{
    while (count--)
        predicate();
}

上記の関数は次のように使用できます

repeat(10, [](){ std::cout << "hello\n"; });

上記の呼び出しにより、ラムダが 10 回呼び出されるため、"hello"10 回出力されます。

于 2013-06-02T13:40:16.663 に答える