是否可以拥有像
这样的非会员运营商bool operator==(const std::string &l, const Token r)
作为无关类Interpreter
的私有成员函数?
我以明显的方式尝试了它,但它不起作用(参数太多)。
我知道,已经标题为“非成员函数[...]成员”的说法恰恰相反,但是有一种比函数更好的方式
bool isToken(const std::string &l, const Token r)
进行比较,该比较取决于Interpreter
无法将Token
与string
之外的Interpreter
进行比较。
一些进一步的信息:令牌是一个枚举,并且比较取决于构造Interpreter
时设置的语言。
答案 0 :(得分: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==
的模板版本时,它会解析为相应语言特定命名空间中的语言特定实现。
答案 1 :(得分:0)
由于比较是由一个非静态的Interpreter成员(比如is_equal())进行的,你需要三个对象来进行比较:一个Interpreter,一个字符串和一个Token。
如果您知道在比较时只有一个有效的Interpreter对象实例,您可以静态访问此实例,例如。
bool operator==(const std::string &l, const Token r)
{
return Interpreter::instance().is_equal(l, r);
}
其中静态成员instance()返回执行工作的Interpreter对象。