У меня есть приложение, в котором я создаю функцию, 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
?