C++ 模板和 C 预处理器
C++ templates and C preprocessor
考虑一下这段代码。代码做什么并不重要,重要的是模板样板代码是如何编写的。
从样板的角度来看,代码具有一些重要的优点。
更少样板代码。
如果您决定采用更多模板参数,您只需更改 class 定义和 #define
.
缺点很明显:
使用预处理器
不太可读
很奇怪
有这样的标准化吗?
#include <cstdio>
template<typename T>
struct Summator{
Summator(T v1, T v2);
T value1();
T value2();
T sum();
bool great();
private:
T v1;
T v2;
};
#define Summator_(type) template<typename T> type Summator<T>
Summator_()::Summator(T v1, T v2) : v1(v1), v2(v2){};
Summator_(T)::value1(){
return v1;
}
Summator_(T)::value2(){
return v1;
}
Summator_(T)::sum(){
return v1 + v2;
}
Summator_(bool)::great(){
return v1 > v2;
}
int main(){
Summator<int> s{ 5, 6 };
printf("%d\n", s.sum() );
}
考虑到出于大多数实际目的,class 模板的成员函数必须是内联的,您不妨在调用主体中定义它们。特别是对于像这样的小函数。
显然真实的 class 模板可能具有一两个重要的功能 - 但您只需要用于这一个或两个功能的样板。
标准中没有定义任何内容来帮助解决这个问题,我不确定我是否希望如此。如果你必须这样做,记得在之后#undef 定义(因为否则你会污染你的class 用户的#define 命名空间)。
如果我对你的问题的理解正确,你想避免在每个函数定义前编写整个模板吗?
我想大多数关心这个的人都依赖 IDE 来生成空函数定义/重构现有函数?
我认为使用宏不是一个好主意,只是为了节省一点打字,感觉就像是一场维护噩梦。
much less boilerplate code.
不对,一样
if you decide to take more template parameters, you change only class definition and the #define.
阅读:如果您决定完全更改设计...也许您可以节省一些输入(但话又说回来,也许不会)
using preprocessor
是的 - 所以这是不对的。
not so readable
所以"no"再
just weird
不相关
Is there anything standardized like this?
显然不是
考虑一下这段代码。代码做什么并不重要,重要的是模板样板代码是如何编写的。
从样板的角度来看,代码具有一些重要的优点。
更少样板代码。
如果您决定采用更多模板参数,您只需更改 class 定义和
#define
.
缺点很明显:
使用预处理器
不太可读
很奇怪
有这样的标准化吗?
#include <cstdio>
template<typename T>
struct Summator{
Summator(T v1, T v2);
T value1();
T value2();
T sum();
bool great();
private:
T v1;
T v2;
};
#define Summator_(type) template<typename T> type Summator<T>
Summator_()::Summator(T v1, T v2) : v1(v1), v2(v2){};
Summator_(T)::value1(){
return v1;
}
Summator_(T)::value2(){
return v1;
}
Summator_(T)::sum(){
return v1 + v2;
}
Summator_(bool)::great(){
return v1 > v2;
}
int main(){
Summator<int> s{ 5, 6 };
printf("%d\n", s.sum() );
}
考虑到出于大多数实际目的,class 模板的成员函数必须是内联的,您不妨在调用主体中定义它们。特别是对于像这样的小函数。
显然真实的 class 模板可能具有一两个重要的功能 - 但您只需要用于这一个或两个功能的样板。
标准中没有定义任何内容来帮助解决这个问题,我不确定我是否希望如此。如果你必须这样做,记得在之后#undef 定义(因为否则你会污染你的class 用户的#define 命名空间)。
如果我对你的问题的理解正确,你想避免在每个函数定义前编写整个模板吗?
我想大多数关心这个的人都依赖 IDE 来生成空函数定义/重构现有函数?
我认为使用宏不是一个好主意,只是为了节省一点打字,感觉就像是一场维护噩梦。
much less boilerplate code.
不对,一样
if you decide to take more template parameters, you change only class definition and the #define.
阅读:如果您决定完全更改设计...也许您可以节省一些输入(但话又说回来,也许不会)
using preprocessor
是的 - 所以这是不对的。
not so readable
所以"no"再
just weird
不相关
Is there anything standardized like this?
显然不是