1

是否可以有一个非会员运营商

bool operator==(const std::string &l, const Token r)

作为不相关类的私有成员函数Interpreter?我以明显的方式尝试了它,但它不起作用(参数太多)。我知道,标题“非成员函数 [...] 作为成员”已经相反了,但是有没有比函数更好的方法

bool isToken(const std::string &l, const Token r)

进行依赖于(非静态)成员的比较Interpreter

无法将Tokens 与strings 之外的s 进行比较Interpreter

一些进一步的信息: Token 是一个枚举,并且比较取决于构建一个Interpreter.

4

2 回答 2

1

不可能operator ==按照您想要的方式制作版本。它不能变成静态的。如果它是一个成员,那么它必须有一个参数。

如果您愿意“复制代码”,那么您可以使用命名空间来玩花样。您的通用解释器可以是一个模板,它将特定语言的派生类作为模板参数。它反过来调用operator==基于语言特定标记的模板。

template <typename TOKEN>
bool operator == (const std::string &l, const TOKEN token) {
    return token == l;
}

// Language specific interpreters inherit from this template
template <typename LANG>
class Interpreter {
public:
    void interpret () {
        std::string s("hi");
        if (s == LANG::KEYWORD_ELSE) {}
    }
};

每个特定语言的子类都Interpreter位于特定语言的命名空间中。该实现重复关键字的枚举,但在其他方面遵循模板实现。

namespace Lang0 {
    class Interpreter : public ::Interpreter<Lang0::Interpreter> {
        //...
    public:
        enum Token { KEYWORD_ELSE, //...
                   };
        static Interpreter & instance () {
            static Interpreter interpreter;
            return interpreter;
        }
    };
}

namespace Lang1 {
    class Interpreter : public ::Interpreter<Lang1::Interpreter> {
        //...
    public:
        enum Token { KEYWORD_ELSE, //...
                   };
        static Interpreter & instance () {
            static Interpreter interpreter;
            return interpreter;
        }
    };
}

每个命名空间还提供了一种特定于语言的实现,operator==用于将字符串与特定于语言的标记进行比较。

namespace Lang0 {
    bool operator == (const Interpreter::Token token, const std::string &l) {
        //...
    }
}

namespace Lang1 {
    bool operator == (const Interpreter::Token token, const std::string &l) {
        //...
    }
}

然后,当 的模板实现Interpreter调用 的模板版本时operator==,它会解析为相应语言特定命名空间中的语言特定实现。

于 2013-08-31T00:30:54.997 回答
0

由于比较是由解释器的非静态成员(例如 is_equal())进行的,因此您需要三个对象来进行比较:解释器、字符串和标记。

如果您知道在比较时只有一个有效的解释器对象实例,您可以让这个实例静态访问,例如

bool operator==(const std::string &l, const Token r)
{
   return Interpreter::instance().is_equal(l, r);
}

其中静态成员 instance() 返回执行工作的解释器对象。

于 2013-08-31T01:29:41.300 回答