gpt4 book ai didi

c++ - 专门化模板类并添加新接口(interface)

转载 作者:行者123 更新时间:2023-11-30 04:44:45 28 4
gpt4 key购买 nike

have通用模板类 Vector。预期用途是让用户专门化通用 Vector 并定义任何自定义操作。例如,

using IntVector = Vector<int>;

IntVector operator+ (const IntVector& a, const IntVector& b);

问题是有些操作不能定义为自由函数,例如 IntVector& operator+= (const IntVector& b);。要解决这个问题,您可以通过继承进行专门化,

class IntVector : public Vector<int> {
public:
IntVector& operator+= (const IntVector& b);
};

IntVector operator+ (const IntVector& a, const IntVector& b);

虽然这有一个问题,在基本模板类上定义的切片运算符返回一个通用的 Vector_view 而不是支持 operator+= 的专用 IntVector_view 。您将不得不使用与基类相同的主体重载切片运算符,只是返回类型不同,这是令人讨厌的。

This是一个相关的问题,建议制作一个包装器对象,这对于每种具体类型来说都相当乏味。有什么简单的方法可以创建一个专门化,您可以在其中添加新接口(interface)而无需重新定义类型?如果那是唯一的答案,我看不出创建通用基类有什么意义。

最佳答案

您不需要为 += 做任何特别的事情| .

如果我误解了这个问题,请纠正我。可以定义像 operator+= 这样的东西作为免费功能。例如,这是您为 std::vector 定义的方式:

#include <vector>

std::vector<int>& operator+=(std::vector<int>& a, std::vector<int> const& b) {
if(b.size() != a.size())
throw std::logic_error("SIN! SIN! SIN!");

auto* b_scan = b.data();
for(int& value : a) {
value += *b_scan++;
}

return a;
}

或者,如果您想避免污染全局命名空间,您可以在与您的 Vector 相同的命名空间中定义它。类,并且由于参数依赖查找,它仍然可以正常工作。

其他运算符呢,比如operator[]

不幸的是,类似于 operator[] 确实必须是成员函数。我们可以允许用户通过创建调用用户提供的函数的通用模板来定义它的行为:

class Vector {

// Stuff
public:
value_t& operator[] (int idx);
const value_t& operator[] (int idx) const;
// Add this
auto operator[](T index) -> decltype(get_index(*this, index)) {
return get_index(*this, index);
}
};

用户可以控制operator[]的行为通过定义 get_index .例如,我们可以为 get_index 提供定义对于 Vector<int>像这样:

Vector_view<int> get_index(Vector<int>& v, std::pair<int, int> p) {
return {v.begin() + p.first, v.begin() + p.second};
}

此定义可以 Vector 的定义之后,它不必前向声明,并且因为operator[]是一个模板,编译器仍然会找到它。 You can see a working example here.

关于c++ - 专门化模板类并添加新接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57582408/

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