C++ 模板和 C 预处理器

C++ templates and C preprocessor

考虑一下这段代码。代码做什么并不重要,重要的是模板样板代码是如何编写的。

从样板的角度来看,代码具有一些重要的优点。

缺点很明显:

有这样的标准化吗?


#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?

显然不是