gpt4 book ai didi

c++ - 如何将 ANY 类的任意成员函数传递给模板以解析其签名?

转载 作者:太空狗 更新时间:2023-10-29 21:21:53 24 4
gpt4 key购买 nike

在我的引擎中,我有一个简单的反射系统,在编译时填充了类信息(也就是说,围绕模板集构建,它允许我自动生成元信息的过程)。

考虑以下示例:

class Type
{
//...
Map<PropertyHash, TypeProperty> _properties;
};

每种类型都有一个函数:

template <class T>
void InitializeType(TypeInitializer* typeInitializer);

负责类型初始化。 TypeInitializer 几乎没有用于向类型添加字段和基类型的方法。所以基本上,每个新类型只需要专门化这个功能。稍后,当第一次查询类型时,TypeDatabase 创建具体的 Type 对象并为其调用 InitializeType()(TypeInitializer 在构造期间获取指向类型的指针)。例如:

struct CST
{
const float* fptr;
volatile Uint32 vuint;
void** vptr;
};

template <>
SvrInline void InitializeType<CST>(TypeInitializer* typeInitializer)
{
typeInitializer->AddProperty("fptr", &CST::fptr);
typeInitializer->AddProperty("vuint", &CST::vuint);
typeInitializer->AddProperty("vptr", &CST::vptr);
}

就是这样。所有魔法都在 TypeProperty 构造函数中完成,声明为:

template <class Object_type, class Property_type>
TypeProperty(const char* fieldName, Property_type (Object_type::* propertyPtr));

这让我知道属性的确切类型。我测试它的大小、const-ness、volatile-ness 等,并将此信息保存在 TypeProperty 对象中。不错。

现在,我也需要相同的成员函数。 “相同”意味着我可以用与现在添加属性完全相同的方式添加功能。

我的第一个想法是可变参数模板(我的引擎在构建时考虑到了对 C++11 功能的全面支持):

template <typename Object_t, typename Return_t, typename... Args>
TypeMethod(const char* methodName, Return_t (Object_t::*)(Args&&... args)
{
//What now?
}

但是,我不知道应该如何从 args 中提取类型。我看到一篇文章使用函数重载的方法:

template <typename P, typename R, typename Arg1, typename... Args>
void Func(R (P::*)(Arg1 arg1, Args&&... args))
{
}

template <typename P, typename R, typename... Args>
void Func(R (P::*)(Args&&... args))
{
}

template <typename P, typename R>
void Func(R (P::*)())
{
}

函数被递归地“转发”(我知道这不是真正的递归),每次都少一个参数。但是,我不明白这是否适合我的情况。

最佳答案

不需要递归,直接用包展开:

template <typename Object_t, typename Return_t, typename... Args>
TypeMethod(const char* methodName, Return_t (Object_t::*)(Args&&... args)
{
setName(methodName);
setObjectType<Object_t>();
setReturnType<Return_t>();
auto dummy[] = {0, (addArgumentType<Args>(), 0)...};
}

我们将包扩展放在花括号初始化列表中,以确保对 addArgumentType<...> 的调用以正确的顺序制作。

关于c++ - 如何将 ANY 类的任意成员函数传递给模板以解析其签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21703821/

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