1

我刚刚开始思考这个问题。每个 C++ 模板都可以替换为返回类(或函数)对象的“普通”函数吗?正常意味着编译时程序。

所以我想用“普通函数(意味着在编译器解析树或类似的东西上工作的编译时程序)”替换 C++ 编译中的模板实例化,我不想使用 declerative 语法。

你认为通过下面的思路我们可以替换C++中的整个模板机制吗?你认为这种方式更容易理解模板吗?我知道这个问题有点理论,但我不知道在哪里讨论这个问题的最佳地点。

template<typename T>
struct A
{
  int foo();
  bool bar;
  T data;
};

#if 0
class A(typename T) // class bulder after "("
{
  class ret;          // class object can only declared in class builder
  ret.name = "whatever_compile_time_string";
  ret += body         // body is a class builder member with class declaration syntax
         {
           body();    // constructor
           ~body();   // destructor
           int foo(); // method
           bool bar;  // member
         };
  ret += member(T, "data"); // "inject" a templated member

  return ret;
}
#endif


int main()
{
  A<int> a;
#if 0
  // create a new class
  typedef new class A(int) AInt;
  // or
  typedef new class A(int); // in this case class.name must be an initialized thing
#endif
}
4

4 回答 4

3

是的。您所描述的是一个宏观系统。C 预处理器提供了一种弱形式的宏,但在一般情况下,宏只不过是编写源代码(以源代码作为输入)的程序,在编译时执行。

现在,宏观理论变得有些复杂。显然,您可以使用任何可以让您在编译时执行代码的宏系统做任何您想做的事情,但是为了让做正确的事情变得容易,需要做很多工作。(特别是,拥有可以插入的语法引用结构确实很有帮助。)

借助强大的宏系统,许多以前内置于语言中的语句可以改为用户定义或包含在标准库中。

如果您对该主题感兴趣,请查看 Scheme,尤其是 Racket 编程语言。Racket 的核心非常小,用户体验的几乎所有语言都是由宏构建的。

于 2012-09-17T00:13:14.863 回答
2

不。关于模板的主要事情之一是它们提供静态推断的类型安全多态性。

根据定义,您不能在运行时这样做。如果您想将所有内容移至运行时,请不要使用 C++,使用针对后期绑定优化的东西。

更新:如果您说的是在编译时运行的函数,那么(a)您将需要编译器来解释 C++(如果您想用 C++ 编写它),那么您将失去声明性、功能性的好处语言即模板。我没有看到好处。

于 2012-09-16T16:45:39.193 回答
1

C 程序员使用两种方法来实现类似 C++ 中的模板的效果。但是,我认为在 C++ 中使用这些方法而不是模板没有任何好处。但是,如果您认为模板难以理解,请查看以下内容:

通过使用宏:

// N: typename, T: used type
#define MAKE_A(N, T)  class N { \
public: N(){} ~N(){}  bool flag; T data; }

MAKE_A(AInt, int);
MAKE_A(AFloat, float);

通过使用额外的实现头文件:

文件:啊(不要放置包含防护):

// A_NAME: typename, A_TYPE: used type
class A_NAME { 
public: 
    A_NAME(){} 
    ~A_NAME(){}  
    bool flag; 
    A_TYPE data; 
};

用法:

#define A_NAME AInt
#define A_TYPE int
#include "A.h"
#undef A_NAME
#undef A_TYPE 

#define A_NAME AFloat
#define A_TYPE float
#include "A.h"
#undef A_NAME
#undef A_TYPE 
于 2012-09-16T18:27:06.943 回答
1

与模板相比,BOOST.PP 的一个优势是,使用 BOOST.PP 生成的程序比使用模板的等效程序编译得更快,至少根据boost devel list的这篇文章是这样。

即使使用散列而不是线性查找来提高 gcc 的速度,我相信使用 BOOST.PP 仍然更快,我猜是因为 Walter Bright 在引用的帖子中提到的限制。

于 2012-09-18T20:23:04.190 回答