Я пишу вспомогательную функцию, которая должна сделать ее более простой и надежной для некоторых (C/C++ новичков) моих коллег, чтобы получить именованные, скалярные значения параметров из хранилища параметров.
Дело в том, что хранилище параметров может хранить только значения типа double
, но код, который будет вызывать эту функцию, представляет собой большую грязную кучу C, которая была преобразована в C++, поэтому есть места, где это может вызвать проблемы (или по крайней мере, ложные предупреждения), чтобы просто сбросить double
где, например, ожидается int
или long
.
Поэтому у меня возникла идея сделать функцию-помощник функцией-шаблоном с типом возвращаемого значения, являющимся неопределенным аргументом шаблона. Таким образом, вызывающий должен вручную указать тип возвращаемого типа.
Однако аргумент функции является строкой unicode (const wchar_t*
), и я хотел, чтобы пользователи могли называть ее так, как будто они использовали символические имена (выполнялись с использованием макросов, ранее).
Я не могу понять, как объединить функцию функции шаблона, чтобы автоматически подкрепить аргумент! Может ли кто-нибудь предложить какое-то руководство? Я в основном ищу умный макрос/шаблон взлома, я думаю, по эстетическим соображениям ;-)
В качестве макроса:
// the return type is always double
#define GetParameter(parameterName) GetParameterFromParameterStore(L#parameterName)
В качестве функции шаблона:
// the user has to remember to pass the argument as a (wide) string
template<class T> T GetParameter(const wchar_t* parameterName)
{
return (T)GetParameterFromParameterStore(parameterName);
}
Edit: В идеале я хотел бы вызвать функцию:
int _volumePct = GetParameter<int>(VolumeInPercent);
(без дополнительного оформления или синтаксиса).
Один из способов - сделать новый макрос
#define Stringify(parameter) L#parameter
и передать его в функцию шаблона GetParameter, как показано ниже:
GetParameter<int>(Stringify(hello there));
Это то, что вы пытаетесь сделать? но тогда я считаю, что лучше просто набирать результат с помощью существующего макроса.