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

Игорь Шаповал
Игорь Шаповал

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

/* 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();

 

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

 

 

 

 

-12
рейтинг
5 комментариев
Igor Baidiuk

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

Igor Baidiuk
yndx-antoshkka

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

yndx-antoshkka
Игорь Шаповал

Было бы классно. Метаклассы поскорее.

Игорь Шаповал
NeoProgramming

Предлагаю просто разрешить ключевое слово static перед описанием класса. Такие статические классы будут сразу объектами.

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

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

NeoProgramming
Александр Коновалов

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

Александр Коновалов
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения