Понятия: требуется, чтобы возвращаемый метод метода класса был вложенным типом того же класса - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь реализовать следующую концепцию

template<typename T>
concept GameLogic = requires(T a)  {
    typename T::StateType;
    typename T::EventType;
    { a.initialState()->T::StateType }; // <-- relevant bit
};

, где я хочу навязать, что initialState() возвращаемый тип является вложенным типом того же класса.

Определение концепции не не выдает ошибок (g cc 9.2), но следующая реализация GameLogic не удовлетворяет требованию:

class SimpleGameLogic {
public:

    using StateType = SimpleState;
    using EventType = SimpleEvent;

    StateType initialState() {
        return _initialState;
    }

private:
    StateType _initialState;

};

Я пробовал некоторые варианты вышеуказанного синтаксиса, но не могу найти правильный ... или это еще не может быть реализовано? Что я делаю не так?

1 Ответ

4 голосов
/ 01 мая 2020

Три вопроса:

{ a.initialState()->T::StateType }; // <-- relevant bit

Во-первых, синтаксис неправильный, он должен быть:

{ a.initialState() } -> T::StateType;

Во-вторых, вам не хватает typename:

{ a.initialState() } -> typename T::StateType;

В-третьих, в C ++ 20 у нас больше нет -> Type (см. этот ответ ). Вещество с правой стороны стрелки должно быть ограничением. Что-то вроде:

{ a.initialState() } -> std::same_as<typename T::StateType>;

И как только вы это исправите, все заработает .

...