【发布时间】:2012-02-08 06:36:20
【问题描述】:
我有一个应用程序,我正在构建一个函数marshal_and_apply,它使用一些参数调用其他函数(或仿函数)f。 marshal_and_apply 的工作是根据 f 的参数类型对参数应用一些特殊的编组。
如果f 的参数之一属于特殊类型marshal_me<T>,则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?
【问题讨论】:
-
在你的第二个例子中,我看不到你用
7做了什么。你的意思是auto x = marshal_me<int>(storage, 7);还是什么? -
@AaronMcDaid 是的,我已经更正了。
-
如果
marshal_me<int>有一个构造函数采用int,你无论如何都可以调用func2(7, 13)。包装器有什么额外的好处? -
@BenJackson 这个例子是人为的。完整的解释超出了本文的范围,但由于 GPU 编程的特殊要求,我需要以特定方式为函数参数分配内存。
标签: c++ templates c++11 parameter-passing