gpt4 book ai didi

java - 如何在 C++ 模板中实现 Java Generics Self-bounded types 的等价物

转载 作者:太空宇宙 更新时间:2023-11-04 15:50:56 26 4
gpt4 key购买 nike

我在 Java 中收集了一小部分算法,用于玩多个回合制游戏,例如井字棋、黑白棋、西洋跳棋等。我使用 Java 泛型(自限类型)来实现,以便能够使用相同的算法无需为每个游戏专门更改它们。我使用自限类型的原因并未在此处显示,但评估函数需要它。

public interface Game<GAME extends Game<GAME>> {
GAME copy();
int getCurPlayer();
...
}

public class TicTacToe implements Game<TicTacToe> {
...
@Override
public TicTacToe copy() {
...
}
@Override
public int getCurPlayer() {
...
}
...
}

今天,为了学习,我尝试使用 C++ 模板将我的 Java 代码迁移到 C++。

这是我的方法,但显然行不通。

游戏.h

template <typename T>
class Game
{
public:
virtual T copy() const = 0;
virtual int cur_player() const = 0;
...
};

井字棋.h

class TicTacToe : public Game<TicTacToe>
{
public:
virtual TicTacToe copy() const;
virtual int cur_player() const;
...
};

井字游戏.cpp

TicTacToe TicTacToe::copy() {
...
}

int TicTacToe::cur_player() {
...
}

当我尝试编译时,我得到的错误是:

out-of-line definition of 'copy' does not match any declaration in 'TicTacToe'

out-of-line definition of 'cur_player' does not match any declaration in 'TicTacToe'

...其他每个纯虚函数也是如此。

最佳答案

您的定义也需要应用const。 CRTP,正如它在 C++(奇怪的重复模板模式)中所熟知的那样,是完全有效的 C++。

不过,这里不需要virtual,CRTP是用来静态派发函数,自动实现功能的。

template <typename T>
class Game
{
T& crtp_cast() { return *static_cast<T*>(this); }
const T& crtp_cast() const { return *static_cast<const T*>(this); }
public:
T copy() const { return crtp_cast(); }
int cur_player() const { return crtp_cast().cur_player(); }
...
};

请注意,在这种情况下,派生类不需要实现“复制”功能,因为“复制”会自动调用复制构造函数。然而,在一般情况下,由于模板是鸭子类型的,所以没有必要做这种事情,通常你只需要使用标准模板。与 Java 的泛型不同,C++ 的模板与继承完全无关——您可以实例化的类型不必从公共(public)接口(interface)继承。

template<typename Game> void f(const Game& g) {
std::cout << g.cur_player();
}
class X {
public:
int cur_player() const { return 1; }
};
class Y {
public:
int cur_player() const { return 2; }
};
int main() {
f(X());
f(Y());
}

关于java - 如何在 C++ 模板中实现 Java Generics Self-bounded types 的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com