2013-10-05 4 views
0

Я пишу вспомогательную функцию, которая должна сделать ее более простой и надежной для некоторых моих коллег из C/C++, чтобы получить именованные, скалярные значения параметров из хранилища параметров.Вызов функции шаблона через макрос, определяющий параметр?

Дело в том, что хранилище параметров может хранить только значения типа double, но код, который будет вызывать эту функцию, является большой грязной кучей C, которая была преобразована в C++, поэтому есть места, где это может вызвать проблемы (или, по крайней мере, ложные предупреждения), чтобы просто сбросить double, где, например, ожидается int или long.

Таким образом, у меня возникла идея сделать функцию-помощник функцией-шаблоном с типом возвращаемого значения, являющимся неопределенным аргументом шаблона. Таким образом, вызывающий должен вручную указать тип возвращаемого типа.

Однако аргумент функции является юникода строкой (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); 

(без дополнительной отделки или син налог).

ответ

1

Один из способов сделать новый макрос stringify

#define Stringify(parameter) L#parameter 

и передать его GetParameter шаблонной функции, как показано ниже:

GetParameter<int>(Stringify(hello there)); 

Является ли это то, что вы пытаетесь сделать? но тогда я считаю, что лучше просто набирать результат с помощью существующего макроса.

+0

Да, но он искупил функцию, чтобы передать результат другим типам. –

+0

Это ответ? –

+0

OP хочет использовать шаблоны для преобразования double в другие типы, такие как int или long, чтобы подавлять предупреждения компилятора. –

Смежные вопросы