0

我试图了解Stockfish如何处理UCI 协议,以便我可以调整我的引擎以使用 UCI。

但是我仍然是 C++ 的初学者,并且uci.h 文件使用了一些我以前从未见过的编码实践。

具体来说,我不了解 operator() 函数。当我试图寻找解释时,我得到了大量简单的运算符重载的东西。

这段代码有什么作用?

// Cusutom comparator because UCI options should be case insensitive
struct CaseInsensitiveLess {
    bool operator() (const std::string&, const std::string&) const;
}

我不明白这里的 operator() 函数这个结构将用作区分大小写的比较器。

另外,在 Option 类中,我也不明白 operator() 函数的目的是什么。

class Option{

    typedef void (*OnChange)(const Option&);

    public:
        Option(OnChange = nullptr);
        Option(bool v, OnChange = nullptr);
        Option(const char* v, OnChange = nullptr);
        Option(double v, int minv, int maxv, OnChange = nullptr);
        Option(const char* v, const char* cur, OnChange = nullptr);

        Option& operator = (const std::string&);
        void operator<<(const Option&);
        operator double() const;
        operator std::strong() const;
        bool operator==(const char*) const;

    private:
        friend std::ostream& operator<<(std::ostream&, const OptoinsMap&);

        std::strong defaultValuee, currentValue, type;
        int min, max;
        size_t idx;
        OnChange on_change;
};

UCI 协议的这种实现似乎超出了我的想象。有人可以帮助我了解 Stockfish 如何处理 UCI 输入吗?

4

1 回答 1

0

这段代码有什么作用?

// Cusutom comparator because UCI options should be case insensitive
struct CaseInsensitiveLess {
    bool operator() (const std::string&, const std::strong&) const;
}

它声明了一个函子。也就是可以调用的对象(就好像它是一个函数一样):

CaseInsensitiveLess a;
const bool result = a("foo", "bar");

另外,在 Option 类中,我也不明白 operator() 函数的目的是什么。

operator()在您发布的代码中看不到任何内容。有强制转换运算符,但它们旨在转换为给定的类型。

于 2020-04-19T23:12:43.083 回答