C++ 模板元编程

标签 c++ templates metaprogramming

我刚刚开始使用模板元编程,所以我只是尝试做一些基本的事情。我得到了适用于 BST 的 Size 和 Lookup “方法”,所以我决定尝试创建一个 String 类。我在 cpp 文件中有此代码:

#include <iostream>
#include <string>
using namespace std;

struct Null;

// String
template <char C, typename S>
struct String {
  static const char chr = C;
  typedef S tail;
};

// ToString
template <typename S>
struct ToString;

template <char C, typename S>
struct ToString<String<C, S> > {
  static const string str;
};

template <char C, typename S>
const string ToString<String<C, S> >::str = C + ToString<S>::str; // (*)

template <char C>
struct ToString<String<C, Null> > {
  static const string str;
};

template <char C>
const string ToString<String<C, Null> >::str = C + ""; // to make it a string

int main() {
  typedef String<'H', String<'e', String<'l', String<'l',
             String<'o', Null> > > > > myString;
  cout << ToString<myString>::str << endl;
  return 0;
}

当我运行这段代码时,它会输出“Hell”。我在基本情况下做错了什么?好像和“”有关系,因为我以前有C + ToString<S>::str"" + C + ToString<S>::str在线 (*)然后输出是随机垃圾。

最佳答案

"" + C + ToString<S>::str首先执行指针加法,然后才执行串联,要一直执行字符串串联,请执行 std::string("") + C + ToString<S>::str

关于C++ 模板元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7911611/

相关文章:

c++ - 在 WebKit 中禁用滚动条(平面框架模式)

c++ - 是否有任何常规模式可以确定将...放在模板中的位置?

c++ - 开箱过渡不是天衣无缝

C++ "greater"函数对象定义

c# - 打开模板文件的多个副本(.Net、Excel.Interop)

c++ - typedef 和模板的 undefined symbol ?

perl - 如何告诉 CPAN (Perl) 使用元编程创建的包?

c++ - 通用实现获取类型列表的大小

macros - 半自动函数向量化 (Julia)

C++ 错误 1 ​​错误 C2227 : left of '->keyPress' must point to class/struct/union/generic type