【问题标题】:C++ book-keeping of all instantiations of a class template类模板的所有实例的 C++ 簿记
【发布时间】:2018-07-14 15:37:45
【问题描述】:

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

【问题讨论】:

  • 做这样的事情的通常方法是拥有一个静态数据成员,它的初始化用一些全局单例注册实例化。这不会为您提供编译时类型列表,而是在输入main 之前完全构建的运行时数据结构。您设想的类型列表是不可能的,因为不同的实例化可能出现在不同的翻译单元中,并且只会在链接时聚集在一起。
  • 你可以用std::variant做一些有创意的事情。

标签: c++ c++11


【解决方案1】:

请考虑任何“工厂”实现,它将包含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&lt;int,OneType,SecondType, ...&gt;,作为“注册”过程的一部分。但是你可以在这个工厂中提供和封装额外的类型处理逻辑。

【讨论】:

  • 这似乎是一个很好的解决方案/解决方法。我认为要求客户端代码实例化 Factory 类型是可以接受的。谢谢谢尔盖!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多