您可以将原始字符串修饰符 R"()" 与字符串变量结合使用吗?

Can you combine the raw string modifier R"()" with a string variable?

例子

例如:

string MyString = "Normal\tString";
cout << MyString << endl;

生成以下内容:"Normal String"


原始字符串修饰符 附加到字符串,如下所示:

string MyString = R"(Normal\tString)";
cout << MyString << endl;

生成以下内容:"Normal\tString"


问题

有没有办法将 原始字符串修饰符 附加到包含字符串的变量,以便打印变量中包含的字符串的原始形式?

string TestString = "Test\tString";
cout << R(TestString) << endl;

所以你得到:"Test\tString"

Is there a way to append the raw string modifier to a variable containing a string in order to print the raw form of the string contained within the variable?

没有

但是,您可以编写一个函数,将转义序列定义的字符替换为适当的字符串,即将字符 '\t' 替换为字符串 "\t".

示例程序:

#include <iostream>
#include <string>

// Performs only one substitution of \t.
// Needs to be updated to do it for all occurrences of \t and
// all other escape sequences that can be found in raw strings.    
std::string toRawString(std::string const& in)
{
   std::string ret = in;
   auto p = ret.find('\t');
   if ( p != ret.npos )
   {
      ret.replace(p, 1, "\t");
   }

   return ret;
}

int main()
{
   std::string TestString = "Test\tString";
   std::cout << toRawString(TestString) << std::endl;
}

输出:

Test\tString

有点。这可行,但不是一个很好的解决方案:

std::string strToInsert = " insert this "
std::string myRawString = R"(
raw string raw string raw string
raw string raw string raw string
)"; myRawString += strToInsert; myRawString += R"(raw string
raw string raw string raw string
)";

这个问题被标记为 C++11,在这种情况下,滚动你自己的转换函数可能是最好的选择。

但是,如果您有 C++14 编译器,则可以使用 std::quoted 流操纵器:

#include <iostream>
#include <iomanip>

int main() {
    string s = "Hello\tWorld!";
    std::cout << std::quoted(s) << std::endl; // Prints "Hello\tWorld!"
}