const <Container>&
返されたコンテナを外部で変更したくないため、クラスには返されるメソッドがあり、コピーにはコストがかかる可能性があります。たとえば、必要に応じて const 参照を空に返すことができるようにしconst std::set<ClassA>& foo()
たいと考えています。すなわちfoo()
std::set<ClassA>
const std::set<ClassA>& foo(const std::string& key) {
std::map<std::string, std::set<ClassA>>::iterator itr = m_elements.find(key);
return (itr != m_elements.end()) ? *itr : /*empty std::set<ClassA>*/;
}
std::set<ClassA>
しかし、一時的に構築された空の inへの const 参照を実際に返すことはできませんfoo()
。これを解決するために、一般的な場所でジェネリック テンプレート シングルトン クラスを定義して、任意の型で使用できるようにしています。
template <typename T> class cNull
{
public:
static const T& Value() {
static cNull<T> instance;
return instance.d;
}
private:
cNull() {};
cNull(const cNull<T>& src);
void operator=(cNull<T> const&);
T d;
};
だから今foo()
のようなものになることができます
const std::set<ClassA>& foo(const std::string& key) {
std::map<std::string, std::set<ClassA>>::iterator itr = m_elements.find(key);
return (itr != m_elements.end()) ? *itr : cNull<std::set<ClassA> >.Value();
}
私が疑問に思っていたのは、この問題を解決するためのより良い方法があるかどうか、およびこの設計に問題があるかどうかです。