模板类类型定义 - 在类外使用

Template class typedef - use outside of class

本文关键字:定义 类型      更新时间:2023-10-16

我有这样的类:

struct WorkItemResultData;
template <typename ExecutionPolicy>
class Engine
{
public:
    typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr;
}

typedef不依赖于任何模板参数。有没有办法在类之外使用类型 Engine::WorkItemResultData_ptr Engine

编辑我知道我可以像 awoodland 提出解决方案一样使用它,但我的 typedef 独立于类型参数,并希望能够在不指定特定引擎类型的情况下做到这一点。

由于 typedef 根本不依赖于Engine,因此您可以将其从类中拉出:

typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr;
template <typename ExecutionPolicy>
class Engine {...};

如果要将其封装,只需使用命名空间:

namespace Engine
{
    typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr;
}

有没有办法在引擎类之外使用类型 Engine::WorkItemResultData_ptr

是的,但您需要说typename是否在模板上下文中,例如:

template <typename T>
void foo() {
  typename Engine<T>::WorkItemResultData_ptr instance;
}

如果没有类型,则无法访问该typedef。但是,有三种可能的解决方法:

  1. typedef模板之外! - 如果它不依赖于类型,则可能与模板没有太大关系。
  2. 使用荬荚并参考Engine<void>::WorkItemResultData_ptr .
  3. 有一个包含 typedef 的非模板基类并从中继承。然后,您可以很好地访问非模板基类。