, , . , , , .
CRTP
, (CRTP). , :
template<class Derived>
class Player {
public:
void play()
{
auto& derived = static_cast<Derived&>(*this);
for (int i = 0; i < derived.getNumChunks(); i++)
{
if (derived.chunkHasX(i) || derived.chunkHasY(i))
derived.playChunk(i);
}
}
};
class DerivedPlayer : public Player<DerivedPlayer> {
private:
friend class Player<DerivedPlayer>;
int getNumChunks();
bool chunkHasX(int chunkIndex);
bool chunkHasY(int chunkIndex);
void playChunk(int chunkIndex);
};
int main() {
DerivedPlayer p;
p.play();
}
.
, , Player ChunkHolder, :
template<class ChunkHolder>
class Player {
private:
ChunkHolder chunk_holder;
public:
void play()
{
for (int i = 0; i < chunk_holder.getNumChunks(); i++)
{
if (chunk_holder.chunkHasX(i) || chunk_holder.chunkHasY(i))
chunk_holder.playChunk(i);
}
}
};
class MyChunkHolder {
public:
int getNumChunks();
bool chunkHasX(int chunkIndex);
bool chunkHasY(int chunkIndex);
void playChunk(int chunkIndex);
};
int main() {
Player<MyChunkHolder> p;
p.play();
}
.
Update:
, , . :
class IPlayer {
public:
virtual ~IPlayer(){}
virtual void play() = 0;
};
play():
template<class T>
class Player : IPlayer {
public:
void play() override;
};
, , , , .
Live demo CRTP .