类模板的所有实例化的 C++ 簿记

标签 c++ c++11

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

最佳答案

请考虑任何包含 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, ...>在客户端代码中作为“注册”过程的一部分。但是您可以在此工厂中提供和封装额外的所需类型处理逻辑。

关于类模板的所有实例化的 C++ 簿记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51340912/

相关文章:

c++ - 如何定义递归类型?

c++ - 使用 QPointer 和 QObject::connect 与 C++11

c++ - 别名模板特化

c++ - 自动将 c++11 auto 关键字重写为派生类型

c++ - 为什么 std::map::insert 在以下示例中失败?

c++ - Opencv cvDrawContours 不工作

c# - 如何在 C# 或 C++ 中获取窗口的 ShowState?

c++ - C++11 中带有可变参数模板的 bindParameter 函数

c++ - 解析为 time_point 时的格式化时间字符串给出了一个小时的差异

c++ - Foo *foo; 之间的区别和噗噗;在 C++ 中