您将如何“即时”连接文本+整数并将其传递给函数? [复制]

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

我想将文本传递为Text0Text1(等等)“更快”,直接在函数内部写入,从文本和整数开始,无需自己存储其他变量;如:

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 文件

如何在 C++ 中创建 Lua 表,并将其传递给 Lua 函数?

如何在 Cython 中构建 iostream 对象(例如 cout)并将其传递给 c++ 函数?