【问题标题】:Calling a template function through a parameter-stringifying macro?通过参数字符串化宏调用模板函数?
【发布时间】:2013-10-05 16:38:24
【问题描述】:

我正在编写一个帮助函数,它应该让我的一些(C/C++ 新手)同事从参数存储中检索命名的标量参数值变得​​更简单、更简单。

问题是,参数存储只能存储double类型的值,但是调用这个函数的代码是一大堆乱七八糟的C转换成C++,所以有些地方会导致问题(或至少是虚假警告)只是将double 转储到例如应为 intlong

所以我想到了让帮助函数成为模板函数,返回类型是一个未指定的模板参数——这样,调用者必须手动指定返回类型应该是什么。

但是,该函数的参数是一个 unicode 字符串 (const wchar_t*),我希望用户能够像过去使用符号名称一样调用它(以前使用宏完成)..

我不知道如何将模板函数与自动字符串化参数的方法结合起来!任何人都可以提供一些指导吗?出于美学原因,我想我基本上是在寻找一个聪明的宏/模板 hack ;-)

作为一个宏:

// 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);
}

编辑:理想情况下,我希望能够像这样调用函数:

int _volumePct = GetParameter<int>(VolumeInPercent);

(没有任何额外的修饰或语法)。

【问题讨论】:

    标签: c++ templates macros


    【解决方案1】:

    一种方法是创建一个新的宏来字符串化

    #define Stringify(parameter) L#parameter
    

    并将其传递给 GetParameter 模板函数,如下所示:

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

    这是你想要做的吗?但是,我觉得最好使用现有的宏对结果进行类型转换。

    【讨论】:

    • 是的,但他将函数模板化以将结果转换为其他类型。
    • OP 想要使用模板将 double 转换为其他类型,如 int 或 long 以抑制编译器警告。
    • 没关系 :) 我们只是在讨论。
    • 嗨穆拉利克里希纳。感谢您尝试回答我的问题。我有点希望有一个解决方案,允许用户调用我的函数,例如:GetParameter&lt;int&gt;(hello),没有任何额外的语法..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2010-10-09
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多