如果我正确理解您的要求,您需要一个可以获取地址的函数,该函数可以告诉您构造函数或构造函数的参数类型。
#include <string>
#include <new>
template <typename T, typename P0, typename P1>
T * fake_ctor (T *mem, P0 p0, P1 p1) {
return mem ? new (mem) T(p0, p1) : 0;
}
struct Foo {
Foo (int, int) {}
Foo (int, std::string) {}
};
template <class T, typename P0, typename P1>
void BindClassCtor(T *(*FakeCtor)(T *, P0, P1)) {
std::vector<int> Params;
Params.push_back( TypeToInt<P0>() );
Params.push_back( TypeToInt<P1>() );
}
// PARSER GENERATED CALLS
BindClassCtor<Foo, int, int>(&fake_ctor);
BindClassCtor<Foo, int, std::string>(&fake_ctor);
实现fake_ctor
以实际调用ctor
(即使它fake_ctor
本身永远不会被调用)提供了一定程度的编译时健全性。如果Foo
更改其中一个构造函数而不重新生成BindClassCtor
调用,则可能会导致编译时错误。
编辑:作为奖励,我使用带有可变参数的模板简化了参数绑定。一、BindParams
模板:
template <typename... T> struct BindParams;
template <typename T, typename P0, typename... PN>
struct BindParams<T, P0, PN...> {
void operator () (std::vector<int> &Params) {
Params.push_back( TypeToInt<P0>() );
BindParams<T, PN...>()(Params);
}
};
template <typename T>
struct BindParams<T> {
void operator () (std::vector<int> &Params) {}
};
现在,fake_ctor
现在是一个类的集合,这样每个类都可以通过可变参数列表进行实例化:
template <typename... T> struct fake_ctor;
template <typename T>
class fake_ctor<T> {
static T * x (T *mem) {
return mem ? new (mem) T() : 0;
}
decltype(&x) y;
public:
fake_ctor () : y(x) {}
};
template <typename T, typename P0>
class fake_ctor<T, P0> {
static T * x (T *mem, P0 p0) {
return mem ? new (mem) T(p0) : 0;
}
decltype(&x) y;
public:
fake_ctor () : y(x) {}
};
template <typename T, typename P0, typename P1>
class fake_ctor<T, P0, P1> {
static T * x (T *mem, P0 p0, P1 p1) {
return mem ? new (mem) T(p0, p1) : 0;
}
decltype(&x) y;
public:
fake_ctor () : y(x) {}
};
现在 binder 函数就是这样的:
template <typename... T>
void BindClassCtor (fake_ctor<T...>) {
std::vector<int> Params;
BindParams<T...>()(Params);
}
Bar
下面是具有四个构造函数的构造函数参数绑定的说明。
struct Bar {
Bar () {}
Bar (int) {}
Bar (int, int) {}
Bar (int, std::string) {}
};
BindClassCtor(fake_ctor<Bar>());
BindClassCtor(fake_ctor<Bar, int>());
BindClassCtor(fake_ctor<Bar, int, int>());
BindClassCtor(fake_ctor<Bar, int, std::string>());