Конкатенация строк шаблона С++
Я пытаюсь определить некоторый вариационный шаблон:
typedef const char CCTYPE[];
template<CCTYPE X, CCTYPE... P> struct StringConcat { ... };
чтобы я мог написать sth как:
char foo[] = "foo"; char bar[] = "bar";
std::cout << StringConcat<foo, bar>;
и напечатано foobar
.
Как я могу это сделать, если это возможно в С++ 0x?
Мой реальный интерес - решить проблему FizzBuzz с использованием шаблонов С++, я нашел решение здесь для преобразования int в char [] с использованием шаблонов.
Ответы
Ответ 1
#include <boost/mpl/string.hpp>
#include <boost/mpl/insert_range.hpp>
#include <boost/mpl/end.hpp>
#include <iostream>
using namespace boost;
template < typename Str1, typename Str2 >
struct concat : mpl::insert_range<Str1, typename mpl::end<Str1>::type, Str2> {};
int main()
{
typedef mpl::string<'hell', 'o'> str1;
typedef mpl::string<' wor', 'ld!'> str2;
typedef concat<str1,str2>::type str;
std::cout << mpl::c_str<str>::value << std::endl;
std::cin.get();
}
Используя эту конструкцию, вы сможете реализовать свой FizzBuzz в чистом метапрограммировании. Хорошее упражнение BTW.
Ответ 2
Вы можете решить проблему создания вашей работы std::cout << StringConcat<foo, bar>
.
template<CCTYPE...> struct StrBag {};
template<CCTYPE ...Str> void StringConcat(StrBag<Str...>) {}
std::ostream &print(std::ostream &os) {
return os;
}
template<typename ...T>
std::ostream &print(std::ostream &os, CCTYPE t1, T ...t) {
os << t1;
return print(os, t...);
}
template<CCTYPE ...Str>
std::ostream &operator<<(std::ostream &os, void(StrBag<Str...>)) {
return print(os, Str...) << std::endl;
}
Теперь вы можете сказать
char foo[] = "foo"; char bar[] = "bar";
int main() {
std::cout << StringConcat<foo, bar> << std::endl;
}
Надеюсь, что это поможет.
Ответ 3
невыполнима. foo и bar не являются константами времени компиляции. Также нет оснований для этого, когда вы можете использовать простые старые функции:
char foo[] = "foo"; char bar[] = "bar";
std::cout << StringConcat(foo, bar);
Ответ 4
Можно принимать переменные количества символов. Тем не менее, я считаю, что нет никакого способа конкатенации строк, определенных таким образом.
Ответ 5
Вы не можете объединить два или более строковых литералов, ожидающих получения единственного строкового литерала (если вы не хотите использовать макросы). Но в зависимости от задачи вы можете вернуть функцию шаблона, например, std::string, которая является конкатенацией строковых литералов. Последнее тривиально.