building and accessing a list of types at compile time

后端 未结 2 956
伪装坚强ぢ
伪装坚强ぢ 2020-11-27 06:05

I am trying to achieve the following using c++ template metaprogramming. I wish to build up a list of types and then collect these types together and do further compile-time

相关标签:
2条回答
  • 2020-11-27 06:24

    A solution utilizing a common header, variadic templates and a macro:

    // Header common.h
    
    // A distinct Void type
    struct Void {};
    
    template <typename ...> struct concat;
    
    template <template <typename ...> class List, typename T>
    struct concat<List<Void>, T>
    {
        typedef List<T> type;
    };
    
    template <template <typename ...> class List, typename ...Types, typename T>
    struct concat<List<Types...>, T>
    {
        typedef List<Types..., T> type;
    };
    
    template <typename...> struct TypeList {};
    
    template <>
    struct TypeList<Void> {};
    typedef TypeList<Void> TypelistVoid;
    #define TYPE_LIST TypelistVoid
    
    // Header foo.h
    #include <common.h>
    
    class Foo { };
    
    typedef typename concat<TYPE_LIST, Foo>::type TypeListFoo;
    #undef TYPE_LIST
    #define TYPE_LIST TypeListFoo
    
    // Header bar.h
    #include <common.h>
    
    class Bar { };
    
    typedef typename concat<TYPE_LIST, Bar>::type TypeListBar;
    #undef TYPE_LIST
    #define TYPE_LIST TypeListBar
    
    // Header main.h 
    #include "foo.h"
    #include "bar.h"
    
    struct list_of_types {
        typedef TYPE_LIST type;
    };
    // Or just typedef TYPE_LIST list_of_types;
    
    // Test
    #include <iostream>
    #include <typeinfo>
    
    template <template <typename ...> class List, typename T, typename ...Types>
    void info();
    
    template <typename T, typename ...Types>
    inline void info(TypeList<T, Types...>) {
        std::cout << typeid(T).name() << std::endl;
        info(TypeList<Types...>());
    }
    
    template <typename T>
    inline void info(TypeList<T>) {
        std::cout << typeid(T).name() << std::endl;
    }
    
    int main() {
        info(list_of_types::type());
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-27 06:33
    template <typename ... Types>
    void info(TypeList<Types...>) {
    
      std::initializer_list<std::string> ls { typeid(Types).name() ... };
    
      for (auto& name : ls)
        std::cout << name << std::endl;
    }
    
    int main() {
      info(TYPE_LIST());
      return 0;
    }
    
    0 讨论(0)
提交回复
热议问题