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

时间:2018-01-18 16:57:14

标签: c++ templates

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

{
  Id: 11,
  EntryDate: "2017-11-23T00:00:00Z",
  product_id: 1,
  Value: 932.3
},

4 个答案:

答案 0 :(得分:4)

您可以这样做:

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 :(得分:2)

  

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

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

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

  3. 这是您发布的代码的更新版本,使用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);
    }
    

答案 2 :(得分:0)

C ++有 RTTI (运行时类型识别)。也许您想使用std::dynamic_cast

dynamic_cast(elem)尝试从elem

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

答案 3 :(得分:0)

添加到@ Jarod42&#39的答案,您也可以在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);