首页 > 解决方案 > 类模板的所有实例的 C++ 簿记

问题描述

在我的 API 中,我有一个类模板template<class T> struct MyTypeMyType我的 API 的用户可以用几种类型实例化模板(例如MyType<int>, MyType<UserType>, MyType<OtherUserType>。是否有可能在编译时检测所有实例化?有类似的东西:using AllInstantiations = type_list<int, UserType, OtherUserType>?我问的原因是,我想注册这些类型。当阅读字符串,可以是“int”、“UserType”或“OtherUserType”,我想查找已注册的类型并找到匹配的类型。

标签: c++c++11

解决方案


请考虑将包含class ...RegisteredTypes作为std::tuple<RegisteredTypes...>参数的任何“工厂”实现。参见示例:

template <class ... RegisteredTypes>
class Factory
{
public:
    using MyRegisteredClassList = std::tuple<MyClass<RegisteredTypes>...>;
    using RegisteredTypesList = std::tuple<RegisteredTypes...>;

    //Specific type creation Factory method - if encapsulation required
    template<class T,  class ...T_Args>
    static inline MyClass<T> createMyClassInstance(T_Args &&...args)
    {
        //TODO add 'static_assert'
        //for check T as 'RegisteredTypesList' and invoke pretty warning here
        return MyClass<T>(std::forward<T_Args>(args)...);
    }

   //TODO add your method for searching 'string' in 'RegisteredTypesList'
   // use c++17 std::apply(), for example
};

这种方法的缺点是您需要Factory<int,OneType,SecondType, ...>在客户端代码中实例化全局/静态类型作为“注册”过程的一部分。但是你可以在这个工厂中提供和封装额外的类型处理逻辑。


推荐阅读