gpt4 book ai didi

c++ - 在模板函数中获取类型 T 的父级

转载 作者:行者123 更新时间:2023-11-30 05:19:01 26 4
gpt4 key购买 nike

我想找出模板函数中类型类 T 的父类是什么,假设我有以下类:

class A{
...
}

class B: public A{
...
}

class C: public B{
...
}


template<typename T>
size_t getBaseHashCode()
{
return typeid(base_of(T)).hashcode();
}

int main()
{
A a;
C c;
size_t size = getBaseHashCode<C>();// must return hashcode of class B
}

有没有办法找到类型 T 的父级并实现 base_of 函数?

编辑:事实上我想做的是:

我有为我创建对象的工厂类:

template <typename B>
class Factory{
public:
template <typename D>
void registerType(std::string name)
{
static_assert(std::is_base_of<B, D>::value, "class doesn't derive from the base");
table_[name] = &createFunc<D>;
}
B* create(std::string name)
{
const auto it = table_.find(name);
if(it != table_.end())
return it->second();
FILE_LOG(logERROR) << "unidentified option, acceptable options are:";
for(auto const &m : list())
FILE_LOG(logERROR) << '\t' << m;
return nullptr;
}

std::vector<std::string> list()
{
std::vector<std::string> lst;
for(auto const &iter : table_)
lst.push_back(iter.first);
return lst;
}
private:
template<typename D>
static B* createFunc()
{
return new D();
}
typedef B* (*PCreateFunc)();
std::map<std::string, PCreateFunc> table_;
};

在 registerType 函数中,我想设置类型 D 或其父类的一些属性,然后在 create 函数中,我想基于它创建对象。

最佳答案

您还可以考虑使用一些父包装器来自动化 typedefing:

#include <type_traits>
#include <typeinfo>
#include <iostream>

template <class P>
struct base: P {
using base_type = P;
};

struct A{ };
struct B: base<A>{ };
struct C: base<B>{ };

template <class T>
auto base_of(T) -> typename T::base_type;

template <class T>
using base_of_t = decltype(base_of(std::declval<T>()));

int main() {
std::cout << typeid(base_of_t<C>).name() << std::endl;
}

输出:

1B

c++filt -t 1B 的输出:

B

[live demo]

注意还是没有处理多重继承

关于c++ - 在模板函数中获取类型 T 的父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41362580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com