Как проверить типы параметров функции ?

У меня есть приложение, в котором я создаю функцию marshal_and_apply , которая вызывает некоторую другую функцию (или функтор), f с некоторыми аргументами. Задача marshal_and_apply - применить специальный маршалинг для аргументов в зависимости от типа параметров f .

Если один из параметров f имеет особый тип, marshal_me , то 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 ) преобразовываться в тип определенного параметра. .

Как мне собрать marshal_and_apply ?

5
задан Jared Hoberock 11 January 2012 в 22:04
поделиться