std::get をサポートするために特化しなければならないテンプレートは何ですか?
struct MyClass {
int a;
};
template <const size_t I>
struct MyContainer {
MyClass array[I];
};
できるようになるためには、何を専門化する必要がありますか。
MyContainer<16> mc;
std::get<0>(mc);
コンパイル時のインデックスを使用して任意の配列のようなコンテナーにアクセスする必要があるいくつかのアルゴリズムを実装したいと思います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
の標準構造の場合は呼び出され、コンテナの場合は指定した関数が呼び出されます。array
tuple
pair
std::get
get
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;
}