我在这个难题上花了很多周的时间,并认为我可能会将其作为对这里的C ++可变参数模板人群的挑战。如果可以的话,我敢打赌,您会在10秒钟内告诉我如何操作。
假设我在C ++ 17中有一组函数,每个函数都有自己的返回类型(或void),每个都有自己的参数类型。为简单起见,混合使用了POD参数和指向类的指针,可变数量的args等。因此有两个示例:
int somefunc(int x, double d) { return x + (int)d; }
void otherfunc(Foo *a, Bar *b, int x) { ... }
我的目标是通过构建可变参数函数来捕获所有类型的集合,从而在不进行注释的情况下进行静态编译时反射。因此,为了讨论起见,我们可以说我们的函数是RT f(T1 a,T2 b,...)类型。我的上下文是,我正在为RPC和多播系统构建一个新的(并且要好得多)数据编组层,而这些回调实际上将在接收到字节数组后完成,我需要对其进行分组并将其转换为字节数组。适当的类型:从我的字节数组的第一个字节中提取的int,或新的Foo(char *),其中Foo本身具有工厂方法来进行提升,等等。
静态反射是什么意思?我想要一个const std :: list,我可以在其中将诸如typeid(RT).hash_code()之类的内容放入我的Info类中,或者将一个指向每个参数类别的构造函数的指针放入其中(POD构造函数基本上将将字节序列传入int *,然后返回int;类构造函数将调用factory方法)。
好,很长的序言,现在是失败的尝试:这是我的尝试。 C ++ 17根本不喜欢它(似乎可以正确绑定RT,但是无法绑定Rest,也许是因为Rest实际上是RT捕获的整体函数类型中的参数类型列表)。有任何想法吗?
class Info
{
int rt, at; Info *next;
Info(int r, int a, Info* nxt) { rt = r; at = a; next = nxt; }
};
template<typename RT>
Info *Scan(RT cb())
{
return nullptr;
}
template<typename RT, typename T, typename Rest...> Info* Scan(RT cb(T x, Rest... args))
{
return new Info(typeid(RT).hash_code(), typeid(T).hash_code(), Scan<RT, Rest...>(cb(args...));
};
int TestMethod(int x, int y)
{
return 0;
}
int main()
{
Scan(TestMethod);
return 0;
}
最佳答案
您不需要为此使用单独的类或递归,您可以通过在std::array
调用上扩展参数参数包来返回哈希码的hash_code
:
template <typename RT, typename... Args>
std::array<size_t, (sizeof...(Args) + 1)>
Scan (RT (*) (Args...))
{
return { typeid(RT).hash_code(), typeid(Args).hash_code()... };
}
关于c++ - C++-17可变参数模板:捕获回调参数的返回类型和参数类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37439985/