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

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

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

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

 

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

 

 

 

 

-5
рейтинг
4 комментария
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
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения