10

std::get をサポートするために特化しなければならないテンプレートは何ですか?

struct MyClass {
  int a;
};

template <const size_t I>
struct MyContainer {
  MyClass array[I];
};

できるようになるためには、何を専門化する必要がありますか。

MyContainer<16> mc;
std::get<0>(mc);
4

2 に答える 2

1

コンパイル時のインデックスを使用して任意の配列のようなコンテナーにアクセスする必要があるいくつかのアルゴリズムを実装したいと思いますstd::get。その場合、あなたのクラスのために作っbeginて利用できるのと同じビジネスです。endコンテナー クラスを宣言した名前空間で関数getを宣言するだけで、ADL にその仕事を任せることができます。

    template <unsigned I, unsigned N>
    MyClass& get (MyContainer<N>& c) { return c.array[I]; }

    template <unsigned I, unsigned N>
    MyClass const& get (MyContainer<N> const& c) { return c.array[I]; }

あなたのアルゴリズムでは、(名前空間プレフィックスgetなしで) 使用するだけで、ADL は正しい関数を呼び出します。したがって、 、 、などstdの標準構造の場合は呼び出され、コンテナの場合は指定した関数が呼び出されます。arraytuplepair std::getget

    int main(){
        std::array<int, 3> a {{0,1,2}};
        auto t = std::make_tuple(0.0, 1.0f, 2);
        auto p = std::make_pair('0', 4.4);
        MyContainer<3> c;

        std::cout << get<1>(a) << std::endl;
        std::cout << get<1>(t) << std::endl;
        std::cout << get<1>(p) << std::endl;
        std::cout << get<1>(c).a << std::endl;

        return 0;
    }

于 2013-04-24T08:30:42.273 に答える