Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板字符串连接_C++_String_Templates_Metaprogramming_C++11 - Fatal编程技术网

C++ C++;模板字符串连接

C++ C++;模板字符串连接,c++,string,templates,metaprogramming,c++11,C++,String,Templates,Metaprogramming,C++11,我试图定义一些可变模板,如下所示: typedef const char CCTYPE[]; template<CCTYPE X, CCTYPE... P> struct StringConcat { ... }; typedef const char CCTYPE[]; 模板结构StringConcat{…}; 这样我就可以写这样的东西: char foo[] = "foo"; char bar[] = "bar"; std::cout << StringConca

我试图定义一些可变模板,如下所示:

typedef const char CCTYPE[];
template<CCTYPE X, CCTYPE... P> struct StringConcat { ... };
typedef const char CCTYPE[];
模板结构StringConcat{…};
这样我就可以写这样的东西:

char foo[] = "foo"; char bar[] = "bar";
std::cout << StringConcat<foo, bar>;
char foo[]=“foo”;字符条[]=“条”;

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

char foo[] = "foo"; char bar[] = "bar";
std::cout << StringConcat(foo, bar);
char foo[]=“foo”;字符条[]=“条”;

std::cout可以获取不同数量的字符。但是,我相信没有现成的方法来连接这样定义的字符串。

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

#包括
#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();
}
#包括 #包括 #包括 使用名称空间boost; 模板 结构concat:mpl::insert_range{}; int main() { typedefmpl::字符串str1; typedefmpl::string str2; typedef concat::type str;
std::cout将这两个字符串作为常规参数传递有什么问题吗?这对concat字符串来说不是问题,我只想使用模板来实现这一点,我添加了一段描述我正在做的事情。我发现将字符串文本传递给模板的唯一方法如下所述:(1)数组是编译时常量(或者更确切地说,它们是外部符号,可以衰减为指针,而指针又可以用作编译时常量)。它们的内容也是如此。否则,问题中链接到的代码也不会工作。(2)原因现在在问题中陈述了:好奇。这是一个强有力的原因。@Konrad:从这些数组的分配位置的问题来看并不明显。如果它们是局部变量,那么它们就不是编译器时间常量。它们的内容也不是常量。谢谢!因为boost::mpl是一个纯模板库,这就是我可以使用的。不过,我不能这样做工作。如果将main()中的8替换为7,则可以,否则它将无法编译。似乎存在一些mpl实现限制,无法执行超过7个串联。在包含标头之前,需要通过设置BOOST\u mpl\u LIMIT\u string\u SIZE来增加mpl::string的最大长度(这是可变模板的C++03版本..内置预处理器)。在BOOST_PP_LIMIT_MAG-3上,您将遇到一个最大值,在此之前,您的编译器可能会遇到最大宏深度。我可以将其设置为150,但不是200。您可能需要稍微改变一下问题,使其成为可能。无论如何,100次迭代都不是问题的关键部分。看起来您可能已经在任何时候解决了它te…Schaub:我想知道这是一个完整的解决方案吗?因为我无法编译您的代码。很抱歉我的知识有限。@Chan这本来是一个完整的解决方案。请看。您不必为问这个问题感到抱歉:)我只是看到我没有得到一个保证的计算顺序,所以ideone正确地输出了“barfoo”:)让我来修复它。
char foo[] = "foo"; char bar[] = "bar";
int main() {
  std::cout << StringConcat<foo, bar> << std::endl;
}
#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();
}