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