我有一个正在构建功能的应用程序,marshal_and_apply
,它调用一些其他函数(或函子),f
有一些论据。marshal_and_apply
的工作是根据参数的类型对参数应用一些特殊的编组f
的参数。
如果其中之一f
的参数是特殊类型,marshal_me<T>
, then marshal_and_apply
在将参数传递给之前,将通过一些专门分配的存储来编组参数f
。为了执行分配,必须知道所有参数的存储要求marshal_and_apply
在任何可以被编组之前。
一些例子:
template<typename Function, typename... Args>
void marshal_and_apply(Function f, Args... args);
void func1(int x, int y);
void func2(marshal_me<int> x, int y);
void func3(marshal_me<int> x, marshal_me<int> y, marshal_me<int> z);
// this call would be equivalent to:
// func1(7,13)
marshal_and_apply(func1, 7, 13);
// this call would be equivalent to:
// auto storage = my_allocator(sizeof(int));
// auto x = marshal_me<int>(7, storage);
// func2(x, 13);
marshal_and_apply(func2, 7, 13);
// this call would be equivalent to:
// auto storage = my_allocator(sizeof(int) + sizeof(int) + sizeof(int));
// auto x = marshal_me<int>(7, storage);
// auto y = marshal_me<int>(13, storage + sizeof(int));
// auto z = marshal_me<int>(42, storage + sizeof(int) + sizeof(int));
// func3(x,y,z);
marshal_and_apply(func3, 7, 13, 42);
为了解决这个问题,似乎marshal_and_apply
需要一个机制来检查类型f
的参数。我怀疑这通常是不可能的,但也许可以识别出是否是一组特殊类型中的一个(在这种情况下,marshal_me<T>
) 可转换为特定参数的类型。
我应该如何构建marshal_and_apply
?