В 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;
}
Какие-либо указатели? (Никакая игра слов не предназначается.)
Править: Я должен смочь применить это к целочисленным массивам также - не просто массивы символов. Однако в обоих случаях объединенные будущим образом массивы будут фиксированным размером и будут константами времени компиляции.
В 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.
Итак ...
Вы не хотите выполнять конкатенацию во время выполнения.
Вы не хотите использовать препроцессор.
Вы хотите работать с константами и выходными константами.
Хорошо. Но вам это не понравится:
#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();
}
Используйте строковый объект:
#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;
}
В подобных случаях препроцессор часто бывает полезен
#define ARRAY1 "Hello "
#define ARRAY2 "world!\n"
const char array1[] = ARRAY1;
const char array2[] = ARRAY2;
const char array3[] = ARRAY1 ARRAY2;
Примечание: нет необходимости в +
.