是否可以从变量中获取实例化模板的类型?
{
Id: 11,
EntryDate: "2017-11-23T00:00:00Z",
product_id: 1,
Value: 932.3
},
答案 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)
是否可以从变量中获取实例化模板的类型?
是
更新类模板以提供用于实例化它的类型。
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);
}
答案 2 :(得分:0)
C ++有 RTTI (运行时类型识别)。也许您想使用std::dynamic_cast
。
dynamic_cast(elem)尝试从elem
获取T类型的对象答案 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);