閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

int* array; みたいなのを Boost.Range で扱いたい。

ラップするしかないのだろうか。

#include <iostream>
#include <algorithm>
#include <boost/range.hpp>

template<class T>
class Array
{
    size_t m_size;
    T* m_ptr;
public:
    Array(T* ptr, size_t n) : m_ptr(ptr), m_size(n) {}

    typedef T* iterator;
    typedef T const* const_iterator;

    iterator begin() { return m_ptr; }
    iterator end() { return m_ptr + m_size; }

    const_iterator begin() const { return m_ptr; }
    const_iterator end() const { return m_ptr + m_size; }
};

template<class Range, class T>
bool find(Range const& r, T const& target)
{
    return std::find(boost::begin(r), boost::end(r), target) == boost::end(r);
}

int main()
{
    int tmp[] = {1, 2, 3, 4, 5};
    int* arr = tmp;
    
    std::cout << find(tmp, 5) << std::endl;
    std::cout << find(Array<int>(arr, sizeof(tmp)/sizeof(tmp[0])), 5) << std::endl;
}

追記

ちゃんと(?)boost::make_iterator_rangeというユーティリティ関数(と、上の Array よりちゃんとした iterator_range クラス)が用意されていたようです。

std::cout << find(boost::make_iterator_range(arr, arr + sizeof(tmp)/sizeof(tmp[0])), 5) << std::endl;

でいけました。id:uskzさん、いつもありがとうございます。

なんだか教えて君になってきたな……。