gpt4 book ai didi

c++ - 使用 typedeffing 模板化基类来简化代码是一种好习惯吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:49 24 4
gpt4 key购买 nike

最近在处理许多模板化类并从它们派生时,我发现自己“发明”了这个简单的结构。我不确定这是常见做法,还是我在脖子上系了一根绳子。

template <typename T> class Base {};

template <typename T> class Derived : public Base<T>{
typedef Base<T> Base;
};

我发现如果 Base 它特别有用类有自己的typedef s 对于某些类型。例如:

template <typename T> class Base {
typedef T Scalar;
typedef Matrix<Scalar> Matrix;
};

然后很容易将类型“导入”到 Derived 中.它节省了重新键入模板签名。例如:

template <typename T> class Derived : public Base<T>{
typename Base<T>::Matrix yuck_yuck(); //that's what I am trying to simplify
typedef typename Base<T> Base;
typedef typename Base::Matrix Matrix;
Matrix much_fun(); //looks way better
};

还有一个很大的优点是,当你想向 Base 添加另一个模板参数时类(class)。您不必遍历一堆功能来更改,只需更新 typedef . much_fun如果 Base 就没有问题将更改为 Base<T,U>同时yuck_yuck将需要更新签名(不确定模板参数是否正式包含在签名中,所以如果我在这里犯了一个形式错误,请原谅我,但我认为是)。

这是一种很好的做法,还是我在玩重要部位旁边的枪?看起来它使代码更具可读性,并简化了它,但也许我遗漏了一些可能适得其反的东西。

EDIT2:我得到了工作示例。 Base正如评论者指出的那样,类必须在其 namespace 内,否则在一个范围内将与相同的名称发生冲突。以下是体现我的真实问题的最小示例。

namespace Fun {
template <typename T> class Base {
public:
typedef T Scalar;
};
}

template <typename T>
class Derived : public Fun::Base<T>{
public:
typedef typename Fun::Base<T> Base;
typedef typename Base::Scalar Scalar;
typename Fun::Base<T>::Scalar yuck_yuck();
Scalar much_fun();
};

#include <iostream>
using namespace std;

int main() {
Derived<double> d;
return 0;
}

有了很多东西,代码变得非常臃肿 typenames和模板参数。但是我已经在编写示例时遇到了麻烦,因为我没有放置 Base在自己的命名空间中。我想知道是否还有任何其他警告实际上是这个想法的 killer 。

最佳答案

由于 C++11 3.3.7/1 的规则 2,我认为这是错误的

A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S.

这意味着您不能使用名称 Base 来引用类范围内的模板和 typedef。当然,我的编译器不会接受它:

error: declaration of ‘typedef struct Base<T> Derived<T>::Base’ [-fpermissive]
error: changes meaning of ‘Base’ from ‘struct Base<T>’ [-fpermissive]

(注意:这是指最初发布的简化示例,不包括基类名称在不同范围内的更新问题。)

关于c++ - 使用 typedeffing 模板化基类来简化代码是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21461315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com