【问题标题】:Any easy way to reference all parameters of function call?任何简单的方法来引用函数调用的所有参数?
【发布时间】:2021-07-13 00:42:02
【问题描述】:

我写了一个函数“vars_to_string”,它是可变参数模板方式:

template< typename ... Args >
std::string strings_to_string(Args const& ... args)
{
    std::ostringstream stream;
    using List = int[];
    (void)List {
        0, ((void)(stream << to_std_string(*args) << " "), 0) ...
    };
    return stream.str();
}

template< typename ... Args >
inline auto vars_to_string(Args const& ... args)
{
    return strings_to_string(&args...).c_str();
}

函数的调用方式如下:

auto obj_name = vars_to_string("E11", H1, H2, H3, H4, b, D, t, B1, B2, L1, L2);

其中 "H1, H2, H3, H4, b, D, t, B1, B2, L1, L2" 是外部函数的参数,例如:

Q_DECL_EXPORT JQ_DLL_API create_E11(double H1, double H2, double H3, double H4, double b, double D, double t, double B1, double B2, double L1, double L2)
{
    jq_assert(H1 > 0);
    jq_assert(H2 > 0);
    jq_assert(H3 > 0);
    jq_assert(H4 > 0);
    jq_assert(b > 0);
    jq_assert(b < B2&& B2 <= B1);
    jq_assert(B2 <= B1);
    jq_assert(L1 > 0);
    jq_assert(L2 > 0);
    jq_assert(L1 >= L2);
    jq_assert(D > 2 * t);

    if (true) {
        auto obj_name = vars_to_string("E11", H1, H2, H3, H4, b, D, t, B1, B2, L1, L2);

        auto pShapePtr = _query_shape_in_memory(obj_name);
...

目前,还有其他 17 个函数,比如 create_E1 ~ create_E17,我必须在每个函数中遵循这个模式,就像:

auto obj_name = vars_to_string("E17", H1, H2, H3, H4, HXn, nXn, b1, b2, B1, B2, L1, L2, S1, S2, n1, n2);

auto obj_name = vars_to_string("E16", H1, H2, d, B1, B2, L1, L2, B, H, L, H3);

我必须为 17 个函数中的每一个更改“H1、H2、d、B1、B2、L1、L2、B、H、L、H3”部分,因为不同的 create_Exx 函数的参数会有所不同。

我的问题:有没有什么简单的方法可以为这 17 个函数做到这一点?

【问题讨论】:

  • 您的代码有一个悬空指针。不要返回在临时对象上调用的.c_str()
  • 通过指针传递参数包有点奇怪。为什么不直接使用std::forward
  • 请准确说明您要解决的问题。 “在每个功能中遵循这种模式”是什么意思?您打算如何将vars_to_stringcreate_E18 等结合使用?
  • 谢谢,将解决“悬空”指针问题。

标签: c++ variadic-templates


【解决方案1】:

没有反射知道(当前)函数的参数名称。

因此,您必须通过手动传递参数来手动调用每个所需函数的函数。

如果函数的结构足够相似,MACRO 可能会“帮助”

DEFINE_FUNCTION(E11, (double, H1) (double, H2)(double, H3)(double, H4)(double, b) /*..*/)
   // ...
}

替换为

Q_DECL_EXPORT JQ_DLL_API create_E11(double H1, double H2, double H3, double H4, double b, double D, double t, double B1, double B2, double L1, double L2)
{
    auto obj_name = vars_to_string("E11", H1, H2, H3, H4, b, D, t, B1, B2, L1, L2);
    //...
}

但不确定该解决方案是否比手动方式更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多