gpt4 book ai didi

c++ - typedef 模板声明的替代方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:08 25 4
gpt4 key购买 nike

我正在努力完成

namespace NTL
{
typedef std::valarray vector;
}

通过标准 C++。我知道这是不允许的,但我需要一种快速简便的方法(无需重新实现所有函数、运算符、重载等)来获取模板 typedef。

我现在正在做一个模板类 Vector,它有一个 valarray 作为数据成员,但这将需要我为我的 vector 重载所有数学函数(再次......因为 valarray 也这样做)。

有什么想法吗?谢谢!

PS:我可能需要在某个时候扩展 NTL::vector 的功能,并且将其合并到解决方案中的方法会很棒。

最佳答案

在 C++0x 中,这将非常简单,但目前您可以通过两种方式解决该问题,即通过元函数或滥用继承。

namespace NTL {
// metafunction
template <typename T>
struct vector_1 {
typedef std::valarray<T> type;
};

// inheritance abuse:
template <typename T>
struct vector_2 : std::valarray<T>
{};
}
int main() {
NTL::vector_1<double>::type var1; // type is std::valarray<double>
NTL::vector_2<double> var2; // type inherits from std::valarray<double>
}

第二种方法可以轻松扩展,但请注意,通常不建议从 STL 容器公开继承,因为它们不是为扩展而设计的。特别是因为它们没有虚拟析构函数,如果您的对象是 deleted 从指向 STL 容器的指针,您最终可能会出现未定义的行为...

我会建议您通过 using 声明进行私有(private)继承并将基本成员函数纳入作用域(比提供公共(public)继承更好)。它将需要更多样板代码,但您无需为所有所需接口(interface)提供转发方法。

顺便说一句,C++0x 的方式是:

namespace NTL {
template <typename T>
using vector = std::valarray<T>;
}

关于c++ - typedef 模板声明的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708593/

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