我刚开始思考这个问题。每个C ++模板都可以用返回类(或函数)对象的“普通”函数替换?正常意味着编译时程序。
所以我想用C ++编译中的模板实例化替换为“普通函数(意味着在编译器解析树上运行的编译时程序或类似的东西)”,我不想使用这种语法。
您是否认为通过以下想法我们可以用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
}
答案 0 :(得分:3)
是。你所描述的是一个宏观系统。 C预处理器提供了一种弱形式的宏,但是,在一般情况下,宏只是编写源代码(将源代码作为输入)的程序,在编译时执行。
现在,宏的理论变得有些复杂。显然,你可以使用任何允许你在编译时执行代码的宏系统做任何你想做的事情,但是做了很多工作以便做正确的事情很容易。 (特别是,你可以插入的语法引用构造确实很有用。)
使用功能强大的宏系统,以前内置于该语言中的许多语句可以由用户定义,或包含在标准库中。
如果您对该主题感兴趣,请查看Scheme,尤其是Racket编程语言。 Racket有一个非常小的核心,几乎所有用户体验的语言都是用宏构建的。
答案 1 :(得分:2)
没有。模板的主要内容之一是它们提供静态推断的类型安全多态性。
根据定义,您无法在运行时执行此操作。如果要将所有内容移动到运行时,请不要使用C ++,使用针对后期绑定优化的内容。
更新:如果你正在谈论一个在编译时运行的函数,那么(a)你将需要你的编译器来解释C ++(如果你想用C ++编写),你就失去了它的好处。声明性的,功能性的语言,即模板。我没有看到好处。
答案 2 :(得分: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.h(不要放入包含警卫):
// 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
答案 3 :(得分:1)
BOOST.PP优于模板的一个优点是生成的程序 BOOST.PP比使用模板的等效程序编译更快,at 至少根据这篇文章boost devel list。
即使使用哈希而不是线性提高gcc的速度 查询,我相信使用BOOST.PP仍然更快,我猜是因为 Walter Bright在参考文章中提到的限制。