获取继承的实例化模板的类型

Get type of inherited instantiated template

本文关键字:类型 实例化 继承 获取      更新时间:2023-10-16

是否可以从变量中获取实例化模板的类型?

struct A { enum E {A_, B, C}; };
struct B { enum E {X, Y, Z}; };
class BaseClass {};
template <typename T> class TemplateClass : public BaseClass {};
class AChild : public TemplateClass<A> {};
class BChild : public TemplateClass<B> {};
template <typename T>
class WorkerClass
{
  static void do_stuff(const BaseClass& a) {}
};
int main(void)
{
  AChild a;
  //need to call WorkerClass<A::E>::do_stuff(a)
}

你可以这样做:

template <typename T>
void foo(TemplateClass<T>& c)
{
    WorkerClass<typename T::E>::do(c)
}

然后

foo(a);

另一种传统方法是在模板类中添加类型:

template <typename T> class TemplateClass : public BaseClass
{
    using type = T;
};

所以你可以做

WorkerClass<AChild::type::E>::do(a);

是否可以从变量中获取实例化模板的类型?

是的。

  1. 更新类模板以提供用于实例化它的类型。

    template <typename T> struct TemplateClass : public BaseClass
    {
       using type = T;
    };
    
  2. 使用
  3. decltype(A)使用A的类型。


这是您发布的代码的更新版本,它使用 g++ 5.4.0 为我编译和构建。

struct A {enum E{AA, AB, AC}; };
struct B {enum E{BX, BY, BZ}; };
class BaseClass {};
template <typename T> struct TemplateClass : public BaseClass
{
   using type = T;
};
class AChild : public TemplateClass<A> {};
class BChild : public TemplateClass<B> {};
template <typename T>
struct WorkerClass
{
  static void dostuff(const BaseClass& a) {};
};
int main(void)
{
  AChild a;
  using type = decltype(a)::type;
  WorkerClass<type::E>::dostuff(a);
}

C++具有RTTI(运行时类型标识(。也许您想为此使用std::dynamic_cast

dynamic_cast(elem( 尝试从 elem 获取类型 T 的对象

  • 如果 T 是指针类型,则返回指向对象的指针,或 0(如果指向的对象不是 T 类型(
  • 如果 T 是引用类型,则返回对对象的引用,或者引发 std::bad_cast 异常

除了@Jarod42的答案之外,您还可以在 C++11 中编写一个类型特征:

template <typename T>
T& GetEnumOfImpl(TemplateClass<T>&);
template <typename T>
using GetEnumOf = typename std::decay_t<decltype(GetEnumOfImpl(std::declval<T&>()))>::E;
...
AChild a;
WorkerClass<GetEnumOf<AChild>>::do_stuff(a);