【发布时间】:2012-07-03 17:27:32
【问题描述】:
如何确定类构造函数参数的数量和类型? 为成员函数做到这一点只是小菜一碟:
template <class T, typename P0, typename P1, typename P2, typename P3>
void BindNativeMethod( void (T::*MethodPtr)(P0, P1, P2, P3) )
{
// we've got 4 params
// use them this way:
std::vector<int> Params;
Params.push_back( TypeToInt<P0>() );
Params.push_back( TypeToInt<P1>() );
Params.push_back( TypeToInt<P2>() );
Params.push_back( TypeToInt<P3>() );
}
template <class T, typename P0, typename P1, typename P2, typename P3, typename P4>
void BindNativeMethod( void (T::*MethodPtr)(P0, P1, P2, P3, P4) )
{
// we've got 5 params
// use them this way:
std::vector<int> Params;
Params.push_back( TypeToInt<P0>() );
Params.push_back( TypeToInt<P1>() );
Params.push_back( TypeToInt<P2>() );
Params.push_back( TypeToInt<P3>() );
Params.push_back( TypeToInt<P4>() );
}
其他成员等等。
但是如何处理类构造函数呢?有没有办法找出他们论点的类型?也许有一种根本不同的方法来解决这个问题,因为它甚至不可能获取构造函数的地址?
编辑:我有一个 C++ 预处理器,它扫描所有源文件,并拥有所有类、方法、ctor 及其确切原型的数据库。我需要基于此生成一些存根。
【问题讨论】:
-
实际上,常规方法也很难:当它们被重载时。
-
这里重载方法没问题,因为你仍然可以获取它们的地址。
-
我怀疑你会考虑在头文件上运行一些工具来为你解决这个问题。您可以编写一些模板元编程魔术来尝试“蛮力”这些类型,但这只有在您手头有所有已知类型的列表时才有效,这在任何实际系统中都不太可能。
-
我有这个工具和项目中所有已知类/结构的列表。它是内部制作的,它为方法生成所有必要的绑定。我只是在计划如何处理构造函数。
-
@SergeyK。很抱歉,由于标准,我认为这是不可能的,您必须制作代理工厂方法。
标签: c++ templates constructor preprocessor auto-generate