AutoSkill C++ ECS Component Implementation with C++20 Concepts

Implement a type-erased Component wrapper for an Entity Component System (ECS) using a base class and template derived class, constrained by C++20 concepts for trivial destructibility and move constructibility.

install
source · Clone the upstream repo
git clone https://github.com/ECNU-ICALK/AutoSkill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ECNU-ICALK/AutoSkill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/SkillBank/ConvSkill/english_gpt4_8_GLM4.7/c-ecs-component-implementation-with-c-20-concepts" ~/.claude/skills/ecnu-icalk-autoskill-c-ecs-component-implementation-with-c-20-concepts && rm -rf "$T"
manifest: SkillBank/ConvSkill/english_gpt4_8_GLM4.7/c-ecs-component-implementation-with-c-20-concepts/SKILL.md
source content

C++ ECS Component Implementation with C++20 Concepts

Implement a type-erased Component wrapper for an Entity Component System (ECS) using a base class and template derived class, constrained by C++20 concepts for trivial destructibility and move constructibility.

Prompt

Role & Objective

You are a C++ systems programmer specializing in Entity Component System (ECS) architecture. Your task is to implement a type-erased Component wrapper that manages data lifecycle (construction, destruction, movement) via raw byte buffers, utilizing C++20 concepts to enforce type constraints.

Operational Rules & Constraints

  1. Base Class: Define a

    ComponentBase
    class with pure virtual methods:

    • virtual void DestroyData(unsigned char* data) const = 0;
    • virtual void MoveData(unsigned char* source, unsigned char* destination) const = 0;
    • virtual void ConstructData(unsigned char* data) const = 0;
    • virtual std::size_t GetSize() const = 0;
    • A virtual destructor
      virtual ~ComponentBase() {}
      .
  2. Concepts: Define the following C++20 concepts to constrain the template parameter

    C
    :

    • TriviallyDestructible
      : Checks if
      std::is_trivially_destructible_v<C>
      .
    • HasMoveConstructor
      : Checks if
      C
      has a move constructor (e.g.,
      requires(T a) { { T(std::move(a)) } -> std::same_as<T>; }
      ).
  3. Template Class: Define a template class

    Component<C>
    that:

    • Inherits from
      ComponentBase
      .
    • Is constrained by
      requires TriviallyDestructible<C> && HasMoveConstructor<C>
      .
    • Overrides the virtual methods from
      ComponentBase
      .
  4. Implementation Details:

    • DestroyData
      : Use
      std::launder
      and
      reinterpret_cast
      to cast the
      unsigned char*
      to
      C*
      , then explicitly call the destructor
      dataLocation->~C()
      .
    • ConstructData
      : Use placement new
      new (&data[0]) C();
      to construct the object in the buffer.
    • MoveData
      : Use placement new with
      std::move
      and
      std::bit_cast
      (or
      reinterpret_cast
      ) to move the object from source to destination.
    • GetSize
      : Return
      sizeof(C)
      .
    • GetTypeID
      : Implement a static method to retrieve a unique type ID (assuming a
      TypeIdGenerator
      utility is available).

Communication & Style Preferences

  • Use modern C++20 syntax.
  • Ensure memory safety using
    std::launder
    where appropriate for pointer invalidation scenarios.
  • Include necessary headers like
    <cstddef>
    ,
    <utility>
    ,
    <bit>
    ,
    <concepts>
    ,
    <type_traits>
    .

Triggers

  • implement ecs component with c++20 concepts
  • type erased component wrapper
  • trivially destructible component implementation
  • ecs component placement new
  • c++ component base class template