Объедините две постоянных строки (или массивы) в одну постоянную строку (или массив) во время компиляции

В C# и Java, возможно создать постоянные строки с помощью одной или нескольких других постоянных строк. Я пытаюсь достигнуть того же результата в C++ (на самом деле, в C++ 0x, быть конкретным), но понятия не иметь, какой синтаксис я использовал бы для достижения его, если такая вещь возможна в C++. Вот пример, иллюстрирующий, что я хочу сделать:

#include <stdio.h>

const char array1[] = "Hello ";
const char array2[] = "world!\n";
const char array3[] = array1 + array2; // C++ doesn't like it when I try this

int main() {

    printf(array3);

    return 0;

}

Какие-либо указатели? (Никакая игра слов не предназначается.)

Править: Я должен смочь применить это к целочисленным массивам также - не просто массивы символов. Однако в обоих случаях объединенные будущим образом массивы будут фиксированным размером и будут константами времени компиляции.

6
задан nonoitall 30 June 2010 в 23:40
поделиться

4 ответа

В C ++ 0x вы можете сделать следующее:

template<class Container>
Container add(Container const & v1, Container const & v2){
   Container retval;
   std::copy(v1.begin(),v1.end(),std::back_inserter(retval));
   std::copy(v2.begin(),v2.end(),std::back_inserter(retval));
   return retval;
}

const std::vector<int> v1 = {1,2,3};
const std::vector<int> v2 = {4,5,6};
const std::vector<int> v3 = add(v1,v2);

Я не думаю есть способ сделать это для контейнеров STL в C ++ 98 (добавление для v3 вы можете сделать, но вы не можете использовать списки инициализаторов для v1 и ] v2 в C ++ 98), и я не думаю, что есть способ сделать это для необработанных массивов в C ++ 0x или C ++ 98.

4
ответ дан 8 December 2019 в 04:28
поделиться

Итак ...

Вы не хотите выполнять конкатенацию во время выполнения.

Вы не хотите использовать препроцессор.

Вы хотите работать с константами и выходными константами.

Хорошо. Но вам это не понравится:

#include <boost/mpl/string.hpp>

#include <iostream>

int main()
{
  using namespace boost::mpl;

  typedef string<'Hell', 'o '> hello;
  typedef string<'Worl', 'd!'> world;
  typedef insert_range<hello, end<hello>::type, world>::type hello_world;

  std::cout << c_str<hello_world>::value << std::endl;

  std::cin.get();
}
7
ответ дан 8 December 2019 в 04:28
поделиться

Используйте строковый объект:

#include <iostream>
#include <string>

const std::string s1 = "Hello ";
const std::string s2 = "world!\n";
const std::string s3 = s1 + s2;

int main()
{
  std::cout << s3 << std::endl;
}
5
ответ дан 8 December 2019 в 04:28
поделиться

В подобных случаях препроцессор часто бывает полезен

#define ARRAY1 "Hello "
#define ARRAY2 "world!\n"

const char array1[] = ARRAY1;
const char array2[] = ARRAY2;
const char array3[] = ARRAY1 ARRAY2;

Примечание: нет необходимости в + .

4
ответ дан 8 December 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: