获取继承的实例化模板的类型
Get type of inherited instantiated template
是否可以从变量中获取实例化模板的类型?
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);
是否可以从变量中获取实例化模板的类型?
是的。
-
更新类模板以提供用于实例化它的类型。
template <typename T> struct TemplateClass : public BaseClass { using type = T; };
使用 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);
相关文章:
- 检查某些类型是否是模板类 std::optional 的实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 实例化模板时,我是否必须显式显示参数包中的类型?
- 为什么找不到使用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?
- 使用非量表类型实例化模板时修复编译错误
- 如何根据参数的类型实例化不同的类
- 如何使用引用类型实例化模板函数
- 防止为字符串流提取运算符不支持的类型实例化模板类 (>>)
- 编译器是否也将所有参数依赖类型实例化,即使超载函数的参数计数不匹配
- 使用合格类型实例化的模板内部功能的名称分辨率
- 强制static_assert在类型实例化期间激发
- 在运行时根据不同的类型实例化模板类
- 按类型实例化C++ lambda
- 标准容器模板可以用不完整类型实例化吗?
- visual c++泛型类型实例化
- 基于运行时类型实例化构造函数
- 如何用自己的类型实例化超类模板
- SFINAE用于类型实例化
- 阻止为给定类型实例化模板化的成员函数
- 泛型JNI类型实例化