cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Создание одиночки языковыми средствами #397

Closed apolukhin closed 2 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +2, -15 Автор идеи: Игорь Шаповал

Почти в каждой программе нужно создавать классы, которые имеют один единственный объект. Для этого используется паттерн Одиночка.

/* definition */
class singleton {
public:
        static singleton& get_instance() {
                static singleton instance;
                return instance;
        }

        void some_function() {
             cout << "I am singleton!" << endl;
        }

private:        
        singleton() = default;
       ~singleton() = default;

        singleton(const singleton&) = delete;
        singleton& operator=(const singleton&) = delete;
};

/* use */
singleton::get_instance().some_function();

При этом мы пишем много лишнего кода. В языках Kotlin, Scala можно создавать одиночку проще и легко. Мы описывает класс и создаем один класс.

/* definition */
object singleton {    
    void some_function() {
        cout << "I am singleton!" << endl;
    }
};

/* use */ 
singleton.some_function();

Было классно если можно было бы в С++ писать подобным образом.

apolukhin commented 3 years ago

Igor Baidiuk, 28 декабря 2018, 15:27 Однозначно лишнее. Синглтонов и так чем меньше, тем лучше. Плюс, шаблонный "синглетонофикатор" написать не составляет труда.

yndx-antoshkka, 28 декабря 2018, 15:36 К ~С++26 можно будет реализовать этот функционал через метаклассы, на уровне стандартной библиотеки. Думаю что до тех пор в комитете идея не пройдёт.

Игорь Шаповал, 31 декабря 2018, 13:05 Было бы классно. Метаклассы поскорее.

NeoProgramming, 1 января 2019, 17:55 Предлагаю просто разрешить ключевое слово static перед описанием класса. Такие статические классы будут сразу объектами.

static class Foo {
  int x, y;
public:
  void foo() { /*....*/ };
};

// вызов
Foo.foo();
// или
Foo::foo();

Александр Коновалов, 11 марта 2019, 22:53 NeoProgramming, такой синтаксис я бы сказал чужд для C++ во многих отношениях. От static ожидаешь именно статической переменной, поэтому если такой класс будет вложен в другой, да ещё и будет объявлена после переменная (а что нам может запретить это сделать?), я скорее предположу, что статическая переменная. Далее Foo.foo(); и Foo::foo(); с точки зрения языка совершенно не одно и то же. Вот пусть в Foo::foo() будет доступ к какому-то не статическому члену класса Foo. Тогда вызов Foo::foo() явно будет выглядеть как ошибка.

apolukhin commented 2 years ago

Закрываю, как непопулярную идею. Голосование в международном комитете не пройдёт.