是否可以有像这样的非成员(member)运营商
bool operator==(const std::string &l, const Token r)
作为不相关类Interpreter
的私有(private)成员函数?
我以明显的方式尝试了它,但它不起作用(参数太多)。
我知道,标题“非成员函数 [...] 作为成员”已经说了相反的话,但是有没有比函数更好的方法
bool isToken(const std::string &l, const Token r)
要根据 Interpreter
的(非静态)成员进行比较?
不可能在 Interpreter
之外将 Token
与 string
进行比较。
一些进一步的信息: token 是一个枚举,比较取决于构建解释器
时设置的语言。
最佳答案
不可能按照您想要的方式制作 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==
的模板版本时,它解析为相应语言特定命名空间中的语言特定实现。
关于c++ - 非成员(member)运营商作为外国类(class)的私有(private)成员(member),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18542975/