C++模板字符串连接

发布于 2024-10-11 22:35:30 字数 648 浏览 2 评论 0原文

我正在尝试定义一些像这样的可变参数模板:

typedef const char CCTYPE[];
template<CCTYPE X, CCTYPE... P> struct StringConcat { ... };

这样我就可以编写如下内容:

char foo[] = "foo"; char bar[] = "bar";
std::cout << StringConcat<foo, bar>;

并且它打印了 foobar。 如果在 C++0x 中可以的话,我该如何做到这一点?

我真正感兴趣的是解决 FizzBu​​zz 问题使用c ++模板,我找到了一个解决方案这里将int转换为使用模板的 char[]。

I'm trying to define some variadic template like that:

typedef const char CCTYPE[];
template<CCTYPE X, CCTYPE... P> struct StringConcat { ... };

so that I could write sth like:

char foo[] = "foo"; char bar[] = "bar";
std::cout << StringConcat<foo, bar>;

and it printed foobar.
How can I do this, if it's possible in C++0x?

my real interest is to solve FizzBuzz problem using c++ templates, I found a solution here to convert an int to char[] using templates.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

花海 2024-10-18 22:35:30
#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();
}

使用该构造,您应该能够在纯元编程中实现 FizzBu​​zz。顺便说一句,很好的锻炼。

#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();
}

Using that construct you should be able to implement your FizzBuzz in pure metaprogramming. Nice exercise BTW.

谜泪 2024-10-18 22:35:30

您可以解决使 std::cout << 的问题StringConcat 工作。

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;
}

希望它有帮助。

You can solve the problem of making your std::cout << StringConcat<foo, bar> work.

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;
}

Now you can say

char foo[] = "foo"; char bar[] = "bar";
int main() {
  std::cout << StringConcat<foo, bar> << std::endl;
}

Hope it helps.

我做我的改变 2024-10-18 22:35:30

不可能的。 foo 和 bar 不是编译时常量。当您可以使用普通的旧函数时,也没有理由这样做:

char foo[] = "foo"; char bar[] = "bar";
std::cout << StringConcat(foo, bar);

Impossible. foo and bar are not compile time constants. There is also no reason to do this when you can use plain old functions:

char foo[] = "foo"; char bar[] = "bar";
std::cout << StringConcat(foo, bar);
断肠人 2024-10-18 22:35:30

可以采用可变数量的字符。然而,我相信没有现有的方法来连接这样定义的字符串。

It is possible to take variable amounts of characters. However, I believe that there is no existing way to concatenate strings defined like that.

时光无声 2024-10-18 22:35:30

您不能连接两个或多个字符串文字以获取单个字符串文字(除非您想使用宏)。但根据手头的任务,您的模板函数可以返回,例如 std::string,它是字符串文字的串联。后者是微不足道的。

You cannot concatenate two or more string literals expecting to get a single string literal (unless you want to use macros). But depending on the task at hand you can your template function return, for example, a std::string, which is a concatenation of string literals. The latter is trivial.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文