여기에있는 다른 토론 외에도 사용을 하나의 인스턴스로 제한하지 않고 전역 성을 가질 수 있다는 점에 주목할 가치가 있습니다. 예를 들어, 참조 카운트의 경우를 생각해보십시오.
struct Store{
std::array<Something, 1024> data;
size_t get(size_t idx){ /* ... */ }
void incr_ref(size_t idx){ /* ... */}
void decr_ref(size_t idx){ /* ... */}
};
template<Store* store_p>
struct ItemRef{
size_t idx;
auto get(){ return store_p->get(idx); };
ItemRef() { store_p->incr_ref(idx); };
~ItemRef() { store_p->decr_ref(idx); };
};
Store store1_g;
Store store2_g; // we don't restrict the number of global Store instances
이제 함수 내부 (예 :)에서 main
다음을 수행 할 수 있습니다.
auto ref1_a = ItemRef<&store1_g>(101);
auto ref2_a = ItemRef<&store2_g>(201);
Store
참조는 컴파일 타임에 정보가 제공되므로 해당 포인터를 다시 저장할 필요가 없습니다 . 또한 Store
컴파일러가 전역을 요구하기 때문에의 수명 에 대해 걱정할 필요가 없습니다 . 실제로 하나의 인스턴스 만 Store
있는 경우이 방법에는 오버 헤드가 없습니다. 둘 이상의 인스턴스를 사용하면 코드 생성에 대해 영리한 것은 컴파일러의 책임입니다. 필요한 경우, ItemRef
클래스도 할 수 friend
의 Store
(당신이 템플릿 가질 수 친구를!).
경우 Store
자체가 템플릿 클래스는 다음입니다 상황이 지저분 얻을 수 있지만, 아마도 다음과 같은 서명이 헬퍼 클래스를 구현하여,이 방법을 사용하는 것은 여전히 가능하다 :
template <typename Store_t, Store_t* store_p>
struct StoreWrapper{ /* stuff to access store_p, e.g. methods returning
instances of ItemRef<Store_t, store_p>. */ };
사용자는 이제 StoreWrapper
각 글로벌 Store
인스턴스에 대한 유형 (및 글로벌 인스턴스)을 작성 하고 항상 랩퍼 인스턴스를 통해 상점에 액세스 할 수 있습니다 (따라서를 사용하는 데 필요한 템플리트 매개 변수의 세부 사항을 잊어 버림 Store
).