Всем известен шаблон singleton (очень простой пример):
class Singleton
{
private:
static Singleton* instance;
public:
static Singleton* GetInstance() { return instance; }
void Foo() {}
};
И использование:
Singleton::GetInstance()->Foo();
Интересно, почему это GetInstance()
обязательно? Я попытался найти способ исключить вызов этой функции, чтобы иметь возможность писать для примера ...:
Singleton->Foo();
... используя имя класса так же, как я использую переменную, из-за шаблона синглтона и других мер безопасности, таких как удаление открытого конструктора для примера, мы уверены, что у нас есть только один экземпляр, так почему бы и нет " использование класса в качестве переменной "(цитата, кавычка, конечно, только на синтакском языке!).
Каждый раз правило C ++ запрещает следующие примеры:
Singleton->Foo(); // (1)
Singleton()->Foo(); // (2)
Singleton.Foo(); // (3)
Singleton::Foo(); // (4)
Потому что:
- (1)
static Singleton* operator->() { return instance; }
невозможно, перегрузка оператора доступа к элементу класса (->) не может быть статической (см. C2801 ), то же самое для (2) с оператором ()
- (3) и (4) операторы. и :: не может быть перегружен
Единственное решение здесь: макросы, но я на самом деле использую макросы, и я хочу найти другой способ и избегать макросов для этого ...
Это всего лишь синтаксический опрос, я здесь не для того, чтобы обсуждать плюсы и минусы одиночных игр, но мне интересно, почему C ++ позволяет так много вещей для упрощения использования синтаксиса пользовательских классов с перегрузками, пользовательскими литералами, и мы можем ' убрать эту маленькую функцию из шаблона.
Я не ожидаю решения (но если оно есть, оно было бы замечательно), это просто для понимания, почему, чтобы знать, есть ли объяснение, причина проектирования, причина безопасности или что-то еще!
Заранее спасибо!