【问题标题】:Concepts: require class method return type is nested type of same class概念:要求类方法返回类型是同一个类的嵌套类型
【发布时间】:2020-05-01 15:56:24
【问题描述】:

我正在尝试实现以下概念

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

我要强加 initialState() 返回类型是同一类的嵌套类型。

概念定义不会引发错误(gcc 9.2),但GameLogic 的以下实现无法满足要求:

class SimpleGameLogic {
public:

    using StateType = SimpleState;
    using EventType = SimpleEvent;

    StateType initialState() {
        return _initialState;
    }

private:
    StateType _initialState;

};

我已经尝试了上述语法的一些变体,但找不到合适的...或者这可能还没有实现?我做错了什么?

【问题讨论】:

    标签: c++ c++20 c++-concepts


    【解决方案1】:

    三个问题:

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

    首先,语法错误,应该是:

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

    第二,你错过了typename

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

    第三,在 C++20 中,我们不再有 -&gt; Type(参见 this answer)。箭头右侧的东西必须是一个约束。比如:

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

    一旦你解决了这个问题,it works

    【讨论】:

    • 这个奇怪的部分:a.initialState()-&gt;T::StateType 实际上可以是一个有效的表达式,所以编译器无法诊断它......
    • @T.C.:不可能在满足typename T::StateType的同时,所以它应该值得警告(总有一天)。
    • @DavisHerring 我们不是先在对象表达式的类中查找T 吗?所以它可能意味着不是模板参数的东西?
    • @T.C.:这是CWG1089的主题;想法是严格阅读会使其模棱两可,但我认为它应该可靠地找到模板参数(尽管不是通过问题中建议的机制)。
    • @DavisHerring 啊哈,所以在CWG1111 之后我们会明确找到一个成员T(如果存在),但P1787 会反转它。
    猜你喜欢
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多