У меня есть функция, которая должна принимать параметр любого типа. Поэтому я использую шаблоны.
template <typename T>
void Function(T Parameter);
Что функция делает, так это вызывает функцию. В моем реальном приложении есть карта обратных вызовов со строковыми ключами, но это не имеет значения для этого вопроса. Обратный вызов должен быть указателем на функцию с возвращаемым типом void, но с любым типом параметра.
void* Callback;
template <typename T>
void Function(T Parameter)
{
(function<void(T))Callback(Parameter);
}
Предполагая, что обратный вызов имеет правильный тип, это должно работать следующим образом.
Function<int>(42);
// should result in...
(function<void(int))Callback(42);
Но в некоторых случаях я хочу пройти void
в качестве параметра.
Function<void>(void);
// should result in...
(function<void(void)>Callback(void);
Как видите, мне ничего не нужно предоставлять или void
в качестве параметра. Но я не могу пройти void
в качестве аргумента есть ошибка, что имя типа будет неправильным.
Как я могу пройти void
в качестве аргумента функции?
Почему бы просто не указать перегрузку без шаблона?
void* Callback;
template <typename T>
void Function(T Parameter)
{
(function<void(T)>)Callback(Parameter);
}
void Function()
{
(function<void()>)Callback();
}
Других решений пока нет …