gpt4 book ai didi

c++ - 减少类模板特化中的代码重复 (array)

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:01 25 4
gpt4 key购买 nike

如何减少模板专用类的代码重复?

我正在尝试创建一个类 (MyArray),其行为类似于 std::vector 但在某些函数中接收原始指针作为参数。

这是它的简化版本:-

template<class T> class MyArray{
T database[10];
public: T& get(int index){return database[index];}
void set(int index, T t){
database[index]=t;
}
};
template<class T> class MyArray<std::unique_ptr<T>>{
T* database[10];
public: T*& get(int index){return database[index];}
void set(int index, std::unique_ptr<T> t){
T* tmp=t.release();
database[index]=tmp;
}
};

Here是一个测试:-

class B{};
int main() {
MyArray<B> test1;
MyArray<B*> test2;
MyArray<std::unique_ptr<B>> test3;
test3.set(2,std::make_unique<B>()));
return 0;
}

问题:请演示一种优雅的方法来减少 MyArray 中的上述代码重复。

我希望的解决方案可能如下所示:-

template<class T> class MyArray{
using U = if(T=std::uniquePtr<X>){X*}else{T};
U database[10];
public: U& get(int index){return database[index];}
void set(int index, T t){
U u = convert(t);//<-- some special function
database[index]=u;
}
};

可能存在一些内存泄漏/损坏。为简单起见,请忽略它。
我只想要一个想法/粗略的指南。 (不需要提供完整的可运行代码,但我不介意)

在现实生活中,MyArray 中有 20 多个函数,我希望对许多类进行相同的重构。

编辑:我已经(轻微)编辑了一些代码和标签。感谢 AndyG 和 Jarod42。

最佳答案

也许你可以将实现细节委托(delegate)给你提供给你的类的结构,并且你专门化这个结构,而不是 MyArray:

template <typename T>
struct Policy {
using type = T;
static type convert(T t) { ... }
};

template <typename T>
struct Policy<std::unique_ptr<T>> {
using type = T*;
static type convert(T t) { ... }
};

template <typename T, typename P = Policy<T>>
class MyArray
{
using type = typename P::type;

void set(int index, T t) { type result = P::convert(t); }
};

关于c++ - 减少类模板特化中的代码重复 (array<Unique_ptr>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366515/

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