Информация об изменениях

Сообщение Re[15]: Про идентичность const от 24.01.2025 13:52

Изменено 24.01.2025 13:53 rg45

Re[15]: Про идентичность const
Здравствуйте, 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. Этот конструктор вообще можно выкинуть, всё будет работать и без него.

Повторюсь, это лишь иллюстрация идеи — самая примитивная, самая "лобовая". Это идею можно обыграть на сотни вариантов — с многопоточностью, с управляетмым временем жизни, со смартпоинтерами, без смарт-поинтеров, можно использовать оберточные классы и функции и т.д. и т.п. — в зависимости от конкретных условий применения.
Re[15]: Про идентичность const
Здравствуйте, 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. Этот конструктор вообще можно выкинуть, всё будет работать и без него.

Повторюсь, это лишь иллюстрация идеи — самая примитивная, самая "лобовая". Это идею можно обыграть на сотни вариантов — с многопоточностью, с управляетмым временем жизни, со смартпоинтерами, без смарт-поинтеров, можно использовать оберточные классы и функции и т.д. и т.п. — в зависимости от конкретных условий применения.