c++ - 非成员(member)运营商作为外国类(class)的私有(private)成员(member)

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

是否可以有像这样的非成员(member)运营商

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

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

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

要根据 Interpreter 的(非静态)成员进行比较?

不可能在 Interpreter 之外将 Tokenstring 进行比较。

一些进一步的信息: 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/

相关文章:

c++ - 如何从监视列表中隐藏一些类公共(public)属性?

c++ - 添加具有运算符重载的 2x2 矩阵

c++ - 重载运算符不在方法中工作

c++ - 为什么 token 连接在 C++ 中不起作用?

c++ - VS2015 中的智能感知永无止境

c++ - 如何最优雅地获取 std::vector 缓冲区的地址?

c++如何在原始抽象类中创建一个接受派生类输入的函数

php - PHP 类的版本控制

java - 连接三元运算符的 2 个结果时,字符串连接在 Java 中无法正常工作

c++ - 我如何使用 Google Test 在 main() 函数的特定位置调用特定的测试函数?