【发布时间】:2016-06-30 15:05:08
【问题描述】:
考虑一下这段代码。代码做什么并不重要,重要的是如何编写模板样板代码。
从样板的角度来看,该代码有一些重要的优势。
样板代码少得多。
如果您决定采用更多模板参数,则只需更改类定义和
#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() );
}
【问题讨论】:
-
最接近的可能是
std::accumulate()。 -
@πάνταῥεῖ 我认为他指的是使用
Summator_来缩写模板定义shiver。 -
这是关于不必在每个类外成员函数定义前写出
template<class T> /*return_type*/ Summator<T>::?最近有一些关于标准提案的讨论,但绝对不会制作 C++17。 -
使用这样的预处理器通常是导致维护问题的主要原因。忘记一些可能导致奇怪错误的东西也很容易,比如你自己忘记了
Summator_()::Summator(...)中的T -
见P0223。
标签: c++ templates c-preprocessor dry