10

是否有编译器或独立预处理器接受 C++ 文件并运行模板扩展传递,生成具有扩展模板实例化的新 C++ 代码?

我记得 90 年代中期这样的工具,当时模板还是新的和实验性的,预处理器是一种在没有原生模板支持的情况下使用编译器进行模板编程的方法。

这比宏处理步骤复杂得多,因为它可能需要解析和标记代码才能理解上下文。

我希望在编写 OpenCL 代码时使用这样的工具。 OpenCL是 C++,但不支持模板。我希望我可以编写模板,甚至是简单的模板,例如仅带有整数或布尔参数的模板,并使用一些工具预解析文件并通过查找模板的使用并扩展调用并为我提供新的 C++ 代码OpenCL 编译器可以理解。

即使是一个非常有限的工具也可能有用,它不需要支持每个模板怪癖,甚至不需要支持多个模块或任何东西。

替代方案:#define无处不在的宏......更丑陋,不安全,效率更低,通用性更低。

4

3 回答 3

10

Comeau C++可以将 C++“编译”为 C。这似乎接近您的目标,因为 OpenCL 不支持 C++——它更接近于 C。

于 2009-07-16T19:48:35.020 回答
0

没有这样的工具——模板是语言的一部分,而不是一些预处理程序——它们由编译器处理,就像其他代码一样。

于 2009-07-16T19:33:33.427 回答
0

C++ Insights ( https://cppinsights.io/ ) 能够做到这一点(并且更普遍地扩展“高级”语法糖 C++ 结构。它基于 Clang,因此它对代码的理解为尽可能好,并支持最新标准。

例如它将扩展

extern "C" void printf(...);
template<typename T>
int foo(T t)
{
  if constexpr(sizeof(T) == 4) {
    printf("int: %d", t);
  }
  else {
    printf("something else: %d", (int)t);
  }
}

int main()
{
    const char arr[10]{2,4,6,8};

    for(const char& c : arr)
    {
      foo(c);
    }
}

进入

extern "C" void printf(...);
template<typename T>
int foo(T t)
{
  if constexpr(sizeof(T) == 4) {
    printf("int: %d", t);
  }
  else {
    printf("something else: %d", (int)t);
  }
}

/* First instantiated from: insights.cpp:19 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
int foo<char>(char t)
{
  if constexpr(false) {
  } else /* constexpr */ {
    printf("something else: %d", static_cast<int>(t));
  } 
  
}
#endif


int main()
{
  const char arr[10] = {2, 4, 6, 8, '\0', '\0', '\0', '\0', '\0', '\0'};
  {
    char const (&__range1)[10] = arr;
    const char * __begin1 = __range1;
    const char * __end1 = __range1 + 10L;
    for(; __begin1 != __end1; ++__begin1) {
      const char & c = *__begin1;
      foo(c);
    }
    
  }
  return 0;
}
于 2022-02-25T12:42:59.427 回答