Статическое утверждение для методов, если класс был создан специальным ctor

#c #constructor

#c #конструктор

Вопрос:

У меня есть класс Foo , который имеет 2 ctor: один по умолчанию и параметризованный. В моем классе также есть два метода: foo и bar . foo допустимо для вызова любого экземпляра класса и bar допустимо для вызова только в том случае, если объект был создан параметризованным ctor.

 class Foo {
public:
    Foo() = default;
    Foo(int a) { ... }

    void foo() { ... }
    void bar() { ... }
};
 

Я хочу, чтобы только foo метод был доступен, если класс был создан ctor по умолчанию, и foo и bar будет доступен, если класс был создан вторым ctor.

Я могу сделать это, создав некоторую переменную внутреннего состояния класса (скажем, _state ), которая будет инициализирована в обоих ctors и которая будет указывать, какой ctor был вызван

 Foo::Foo() {
    _state = 1;
}

Foo::Foo(int a) {
    _state = 2;
}
 

Используя эту переменную, я могу проверить во время выполнения, какой класс ctor использовался внутри foo и bar функционирует:

 void Foo::bar() {
    if (_state != 2) {
        throw std::runtime_error("Use another ctor");
    }
}
 

Поскольку известно, какой ctor использовался во время компиляции, есть ли какой-либо способ также выполнить такие проверки при вызове методов, которые вызовут ошибку во время компиляции, если использовался неправильный ctor?

Комментарии:

1. Вы знаете «во время компиляции», какой конструктор был вызван в этом конструкторе . Если метод этого класса вызывается из кода, который вызывается из какого-либо другого .cpp файла, который компилируется отдельно, для объекта, который был создан в третьем .cpp файле, как вы предполагаете, что второй .cpp файл, который компилируется отдельно, может знать, как был создан объект? Извините, но C просто не работает таким образом.

2.Если класс, который инициализируется параметризованным конструктором, является a Foo , он может наследовать от Foo instead и помещаться только bar() в этот класс. пример

3. Спасибо за ответ!