Как объединить несколько строк C ++ в одну строку? - PullRequest
131 голосов
/ 19 марта 2009

C # имеет синтаксическую функцию, в которой вы можете объединить множество типов данных в одну строку.

string s = new String();
s += "Hello world, " + myInt + niceToSeeYouString;
s += someChar1 + interestingDecimal + someChar2;

Что будет эквивалентом в C ++? Насколько я вижу, вам придется делать все это на отдельных строках, поскольку он не поддерживает несколько строк / переменных с оператором +. Это нормально, но выглядит не очень аккуратно.

string s;
s += "Hello world, " + "nice to see you, " + "or not.";

Приведенный выше код выдает ошибку.

Ответы [ 24 ]

1 голос
/ 03 января 2016

Если вы хотите использовать c++11, вы можете использовать определяемые пользователем строковые литералы и определить два шаблона функций, которые перегружают оператор плюс для объекта std::string и любого другого объекта. Единственный подводный камень - не перегружать плюсовые операторы std::string, иначе компилятор не знает, какой оператор использовать. Вы можете сделать это, используя шаблон std::enable_if из type_traits. После этого строки ведут себя так же, как в Java или C #. Смотрите мой пример реализации для деталей.

Основной код

#include <iostream>
#include "c_sharp_strings.hpp"

using namespace std;

int main()
{
    int i = 0;
    float f = 0.4;
    double d = 1.3e-2;
    string s;
    s += "Hello world, "_ + "nice to see you. "_ + i
            + " "_ + 47 + " "_ + f + ',' + d;
    cout << s << endl;
    return 0;
}

Файл c_sharp_strings.hpp

Включите этот заголовочный файл во все места, где вы хотите иметь эти строки.

#ifndef C_SHARP_STRING_H_INCLUDED
#define C_SHARP_STRING_H_INCLUDED

#include <type_traits>
#include <string>

inline std::string operator "" _(const char a[], long unsigned int i)
{
    return std::string(a);
}

template<typename T> inline
typename std::enable_if<!std::is_same<std::string, T>::value &&
                        !std::is_same<char, T>::value &&
                        !std::is_same<const char*, T>::value, std::string>::type
operator+ (std::string s, T i)
{
    return s + std::to_string(i);
}

template<typename T> inline
typename std::enable_if<!std::is_same<std::string, T>::value &&
                        !std::is_same<char, T>::value &&
                        !std::is_same<const char*, T>::value, std::string>::type
operator+ (T i, std::string s)
{
    return std::to_string(i) + s;
}

#endif // C_SHARP_STRING_H_INCLUDED
0 голосов
/ 15 мая 2019

Stringstream с простым макросом препроцессора с использованием лямбда-функции выглядит неплохо:

#include <sstream>
#define make_string(args) []{std::stringstream ss; ss << args; return ss;}() 

, а затем

auto str = make_string("hello" << " there" << 10 << '$');
0 голосов
/ 16 января 2019

Вы пытались избежать + =? вместо этого используйте var = var + ... у меня это сработало.

#include <iostream.h> // for string

string myName = "";
int _age = 30;
myName = myName + "Vincent" + "Thorpe" + 30 + " " + 2019;
0 голосов
/ 25 сентября 2013

Это работает для меня:

#include <iostream>

using namespace std;

#define CONCAT2(a,b)     string(a)+string(b)
#define CONCAT3(a,b,c)   string(a)+string(b)+string(c)
#define CONCAT4(a,b,c,d) string(a)+string(b)+string(c)+string(d)

#define HOMEDIR "c:\\example"

int main()
{

    const char* filename = "myfile";

    string path = CONCAT4(HOMEDIR,"\\",filename,".txt");

    cout << path;
    return 0;
}

Выход:

c:\example\myfile.txt
...