【发布时间】: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_string与create_E18等结合使用? -
谢谢,将解决“悬空”指针问题。