非会员运营商作为外国私人会员

时间:2013-08-30 23:46:11

标签: c++ class operator-keyword member non-static

是否可以拥有像

这样的非会员运营商
bool operator==(const std::string &l, const Token r)

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

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

进行比较,该比较取决于Interpreter

的(非静态)成员

无法将Tokenstring之外的Interpreter进行比较。

一些进一步的信息:令牌是一个枚举,并且比较取决于构造Interpreter时设置的语言。

2 个答案:

答案 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对象。