gpt4 book ai didi

c++ - 基础/派生模板类类型

转载 作者:太空狗 更新时间:2023-10-29 23:25:19 26 4
gpt4 key购买 nike

我有一个围绕 std::vector 构建的模板类.看起来……

template <class T>
class Vector {
public:
std::vector<T> vec;

// Constructors...
// Operator overloads...
// Methods...
// etc.
};

我想创建一个派生模板类,ComplexVector这将要求数据类型为 std::complex<T> ,当然我想重用我在类 Vector 中创建的方法、运算符重载等。 .

问题是似乎有两种方法可以做到这一点。

1) 强制声明std::complex<T>作为模板类型。

ComplexVector< std::complex<float> > myVec;

2) 声明ComplexVector仅使用标量类型,然后传递 std::complex输入 Vector构造函数。

ComplexVector<float> myVec;
// Constructor
ComplexVector<T>::ComplexVector() : Vector< std::complex<T> >

选项 1 在开发软件方面要简单得多,但对用户来说却很丑陋,而选项 2 对用户来说要好得多。我想做选项 #2,但我担心它会如何运作。

如果我通过 std::vector<T>到基类的构造函数,这只会改变构造函数的作用,还是整个模板将从类型 T 开始?至 std::complex< T >

如果不是全部转换成std::complex<T> ,这是否意味着我必须重载 Vector 中的所有方法?

最佳答案

模板化类型定义

如果你真的不想特化,你可以像这样简单地使用模板化的 typedef:

template <typename T>
using ComplexVector = Vector<std::complex<T>>;

然后用户可以使用 ComplexVector<float>它会正确地代表 Vector<std::complex<T>> .
这是一个非常简单的解决方案,不太适合您的需求。查看以下针对您的特定问题的解决方案。

模板继承

如果您的目标是仅在 T 时更改特定方法是std::complex<U> , 你必须继承 Vector像这样:

template <typename T>
class Vector
{
public:
bool is_complex() { return false; }
};

template <typename U>
class ComplexVector : Vector<std::complex<U>>
{
public:
bool is_complex() { return true; }
};

这还允许您添加仅适用于 complex 的方法基于 vector 。

ComplexVector 添加方法只有

如果你想能够“增强”ComplexVector ,你可以这样做:

#include <iostream>
#include <complex>

template <typename T>
class Vector
{
public:
bool is_complex() { return false; }
};

template <typename U>
class ComplexVector : Vector<std::complex<U>>
{
public:
bool is_complex() { return true; }
bool only_for_complex() { return true; } // Only in ComplexVector
};

int main() {
Vector<float> float_vec;
ComplexVector<float> complex_vec;

std::cout << "Is float_vec complex? " << float_vec.is_complex() << "\n";
std::cout << "Is complex_vec complex? " << complex_vec.is_complex() << "\n";

// The following line doesn't compile
// std::cout << "Is only_for_complex method in float_vec? " << float_vec.only_for_complex() << "\n";
std::cout << "Is only_for_complex method in complex_vec? " << complex_vec.only_for_complex() << "\n";

return 0;
}

Working demo here

使用小型特征来检查类型

使用一些模板,我们可以创建一个小助手来确定给定类型是否为 ComplexVector或不。如果您想在模板繁重的环境中安全地调用特定方法,这可能会派上用场:

// For any type T, value is false.
template <typename T>
struct is_complex_vector
{
static const bool value = false;
};

// We specialize the struct so that, for any type U,
// passing ComplexVector<U> makes value true
template <>
template <typename U>
struct is_complex_vector<ComplexVector<U>>
{
static const bool value = true;
};

is_complex_vector<typeof(float_vec)>::value; // is false
is_complex_vector<typeof(complex_vec)>::value; // is true

Here is another small demo to demonstrate this behavior in practice
value将在编译时确定。这可以让你使用一些 SFINAE技巧,以便更好地控制程序的流程。 (或者,如果您使用的是 constexpr if,则可以使用 C++17。)

关于c++ - 基础/派生模板类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52230872/

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