C++ 14 でテンプレート可変長引数の型を列挙してstd::vectorに格納して表示させる方法

質問内容

以下のコードなのですが下記の処理内容を実現したいのですがC++14バージョンで行いたいですチャットGDTに質問して行っているのですが提示コードは回答のものですが同じ内容の繰り返しで処理が実現できません。

知りたいこと

C++14実現したいこと部を実現するために以下のコンソールログのエラーの意味と解決方法が知りたい

実現したいこと

AddEntity()関数のテンプレート可変長引数の型を列挙してstd::vector<std::type_info>変数に格納してECSのアーキタイプの識別に型情報を利用したい。

調べたこと

チャットGDTで質問

環境

OS ubuntu
コンパイラ g++
C++ バージョン C++14

C++ 17

cpp

1#include <iostream>2#include <bitset>3#include <string>4#include <tuple>5#include <typeinfo>6#include <vector>7 8class Component9{10public:11 Component()12 {13 14 }15};16 17class Transform : public Component18{19public:20 Transform() : Component()21 {22 23 }24};25 26class SpriteRenderer : public Component27{28public:29 SpriteRenderer() : Component()30 {31 32 }33};34 35class Entity36{37public: 38 Entity()39 {40 41 }42};43 44 45class EntityManager {46public:47 EntityManager() {}48 49 template<typename... args>50 void AddEntity() {51 GetType<args...>();52 for (const std::type_info* info : typeList) {53 std::cout << info->name() << std::endl;54 }55 }56 57private:58 template<typename T>59 void AddType() {60 typeList.push_back(&typeid(T));61 }62 63 // パラメーターパックを展開して型情報を追加するテンプレート関数64 template<typename T, typename... Rest>65 void GetType() {66 AddType<T>();67 if constexpr (sizeof...(Rest) > 0) {68 GetType<Rest...>();69 }70 }71 72 // パラメーターパックが空の場合に対応するオーバーロード73 void GetType() {}74 75 std::vector<const std::type_info*> typeList;76};77 78 79int main()80{81 EntityManager manager;82 manager.AddEntity<Transform,SpriteRenderer>();83 84 85 86 87 return 0;88}

コンソールログ

※コンパイル成功

$ g++ Main.cpp -std=c++17 $

C++ 14

cpp

1#include <iostream>2#include <bitset>3#include <string>4#include <tuple>5#include <typeinfo>6#include <vector>7 8class Component9{10public:11 Component()12 {13 14 }15};16 17class Transform : public Component18{19public:20 Transform() : Component()21 {22 23 }24};25 26class SpriteRenderer : public Component27{28public:29 SpriteRenderer() : Component()30 {31 32 }33};34 35class Entity36{37public: 38 Entity()39 {40 41 }42};43 44class EntityManager {45public:46 EntityManager() {}47 48 template<typename... args>49 void AddEntity() {50 GetType<args...>();51 for (const std::type_info* info : typeList) {52 std::cout << info->name() << std::endl;53 }54 }55 56private:57 template<typename T>58 void AddType() {59 typeList.push_back(&typeid(T));60 }61 62 // パラメーターパックを展開して型情報を追加するテンプレート関数63 template<typename T, typename... Rest>64 void GetType() {65 AddType<T>();66 GetType<Rest...>();67 }68 69 // パラメーターパックが空の場合に対応するオーバーロード70 void GetType() {}71 72 std::vector<const std::type_info*> typeList;73};74 75int main() {76 EntityManager manager;77 manager.AddEntity<Transform,SpriteRenderer>();78 79 return 0;80}

コンソールログ

$ g++ Main.cpp Main.cpp: In instantiation of ‘void EntityManager::GetType() [with T = SpriteRenderer; Rest = {}]’: Main.cpp:66:9: required from ‘void EntityManager::GetType() [with T = Transform; Rest = {SpriteRenderer}]’ Main.cpp:50:9: required from ‘void EntityManager::AddEntity() [with args = {Transform, SpriteRenderer}]’ Main.cpp:77:49: required from here Main.cpp:66:9: error: no matching function for call to ‘EntityManager::GetType<>()’ 66 | GetType<Rest...>(); | ^~~~~~~ Main.cpp:64:10: note: candidate: ‘template<class T, class ... Rest> void EntityManager::GetType()’ 64 | void GetType() { | ^~~~~~~ Main.cpp:64:10: note: template argument deduction/substitution failed: Main.cpp:66:9: note: couldn’t deduce template parameter ‘T’ 66 | GetType<Rest...>(); | ^~~~~~~

コメントを投稿

0 コメント