您将如何“即时”连接文本+整数并将其传递给函数? [复制]
Posted
技术标签:
【中文标题】您将如何“即时”连接文本+整数并将其传递给函数? [复制]【英文标题】:How would you concatenate "on the fly" a text+integer passing it to a function? [duplicate] 【发布时间】:2019-03-09 21:58:13 【问题描述】:我在库中有一个函数(因此,我无法更改),如下所示:
char mName[MAX_PARAM_NAME_LEN];
void IParam::InitBool(const char* name)
strcpy(mName, name);
我想将文本传递为Text0
、Text1
(等等)“更快”,直接在函数内部写入,从文本和整数开始,无需自己存储其他变量;如:
int mIndex = 0;
InitBool("Text" + mIndex);
你会怎么做?包装函数?哪一个?最好的方法?在C#
中做得很好,我发现在C++
中很难做到。
【问题讨论】:
@Öö Tiib:不!我在问如何在不使用 vars 的情况下“即时”进行。InitBool(("Text" + std::to_string(mIndex)).c_str());
?
@markzzz 是的!这个问题的大部分答案都是如何即时完成。
【参考方案1】:
如果您的编译器支持 C++17 功能,您可以使用 fold expression 和字符串流。魔术发生在接受零个或多个参数的stringify()
函数中。
#include <iostream>
#include <sstream>
#include <string>
template <typename... Ts>
std::string stringify(const Ts&... args)
std::ostringstream oss;
(oss << ... << args);
return oss.str();
void InitBool(const char *name)
std::cout << name << '\n';
int main()
int mIndex = 0;
InitBool(stringify("Text", mIndex, '!', 1.0/3.0).c_str());
Live Demo
【讨论】:
对您的代码和here is the C++11 solution 进行一些修改,以便 OP 可以使用。 ;) @JeJo 看起来不错,您可能想将其发布为答案。 不...既然想法是你的,我想看看你的回答。 ;) 你可以更新。另请记住,OP 可能需要在下次InitBool()
调用时清除全局 ostringstream。【参考方案2】:
在 C++ 中,"Text"
是 const char[N]
,它实际上不是字符串类型,而只是末尾带有空字符 ('\0'
) 的字符数组。这不支持任何类型的字符串操作。你需要得到一个std::string
,它确实支持许多字符串操作。由于您需要将mIndex
转换为一个字符串,我们可以直接使用它,表示数字的字符串将处理将"Text"
连接到它。这给了你
int mIndex = 0;
InitBool(("Text" + std::to_string(mIndex)).c_str());
("Text" + std::to_string(mIndex))
部分为您提供一个临时的std::string
,即"Text0"
,然后.c_str()
将const char*
传递给该字符串以传递给函数。
您可以将("Text" + std::to_string(mIndex))
部分包装在类似的函数中
std::string concat(const char* str, int val)
return str + std::to_string(val);
然后函数调用看起来像
InitBool(concat("Text", mIndex).c_str());
【讨论】:
你会如何将它包装成一个函数?所以我可以打电话给Concat("Text", mIndex)
?
@markzzz 你没有,你会得到悬空指针。你最好使用std::string
而不是 char 数组。
或InitBool(Concat("Text", mIndex).c_str())
。
该临时的生命周期在完整表达式结束时结束,因此在 InitBool
内有效。但在您的示例中,它在return
的完整表达结束时结束,所以在InitBool
之前。
@markzzz 是的。 concat
返回的字符串中的内存将在InitBool
结束后被清理。以上是关于您将如何“即时”连接文本+整数并将其传递给函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何从文本框中获取值并将其分配给 Xcode 中的整数变量?
将文本附加到stdout并将其传递给QTextBrowser
如何在 Terraform 变量中连接 S3 存储桶名称并将其传递给主 tf 文件