Здравствуйте, Shmj, Вы писали:
S>Никаким паттерном ты этого не решишь. Можно создать объект и после этого проверить если уже такой существует в словаре — то не включать в словарь повторно. Но для этого придется сначала создать и выполнять проверки на этапе выполнения.
Так уж и быть. Вот тебе в качестве иллюстрации идеи:
http://coliru.stacked-crooked.com/a/33586425fa103e7e
#include <iostream>
template <typename T, auto...x>
inline T Object{x...};
//////////////////////////////////////////////////////////
class MyClass {
public:
const int value;
MyClass(int v) : value(v) {}
};
int main() {
const MyClass& obj1 = Object<MyClass, 5>;
const MyClass& obj2 = Object<MyClass, 5>;
const MyClass& obj3 = Object<MyClass, 10>;
const MyClass& obj4 = Object<MyClass, 10>;
std::cout << "Address of obj1: " << &obj1 << std::endl;
std::cout << "Address of obj2: " << &obj2 << std::endl;
std::cout << "Address of obj3: " << &obj3 << std::endl;
std::cout << "Address of obj4: " << &obj4 << std::endl;
}
Обрати внимание, совсем не обязательно объявлять конструктор constexpr. Этот конструктор вообще можно выкинуть, всё будет работать и без него.
Повторюсь, это лишь иллюстрация идеи — самая примитивная, самая "лобовая". Это идею можно обыграть на сотни вариантов — с многопоточностью, с управляетмым временем жизни, со смартпоинтерами, без смарт-поинтеров, можно использовать оберточные классы и функции и т.д. и т.п. — в зависимости от конкретных условий применения.