gpt4 book ai didi

c++ - 处理类和类的模板函数*

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

下面的代码允许我模板化一个函数接受一个参数,该参数是指向 Box 对象的三种不同指针类型之一的 vector :

const std::vector<std::shared_ptr<Box>>&
const std::vector<std::weak_ptr<Box>>&
const std::vector<Box*>&

有没有办法扩展它以支持:

const vector<Box>& 
const vector<std::reference_wrapper<Box>>

也许有一些 boost ?

#include <vector>
#include <iostream>

class Box{
public:

Box (unsigned int id, unsigned int side): id(id), side(side){}

int volume(){
return side * side * side;
}
unsigned int id;
unsigned int side;

};

template <typename T>
struct is_box_containter {
enum { value = false };
};

template <>
struct is_box_containter <std::vector<std::shared_ptr<Box>>> {
enum { value = true };
};

template <>
struct is_box_containter <std::vector<std::weak_ptr<Box>>> {
enum { value = true };
};

template <>
struct is_box_containter <std::vector<Box*>> {
enum { value = true };
};

template <typename T>
typename std::enable_if<is_box_containter<T>::value>::type
measure(T const& boxes )
{
for (auto& box : boxes) {
std::cout << box->id << " has volume " << box->volume() << std::endl;
}
}

int main (){

std::vector<std::shared_ptr<Box>> some_boxes;
some_boxes.push_back(std::shared_ptr<Box>(new Box(1,4)));
some_boxes.emplace_back(new Box(2, 12));
Box * box_3 = new Box(3, 8);
Box * box_4 = new Box(4, 9);

std::vector<Box*> more_boxes;
more_boxes.emplace_back(box_3);
more_boxes.emplace_back(box_4);

measure(some_boxes);
measure(more_boxes);

return 0;
}

为什么我要问这个问题:我有一个具有两个功能的应用程序,它们实现了几乎相同的逻辑。一个接受 SomeClass 的列表,另一个接受指向 SomeClass 的指针 vector 。我目前正计划重构代码以将 SomeClass 列表替换为指向 SomeClass 的共享指针列表。但我这样做的唯一原因是将逻辑转移到一个通用的实现中。如果有一种完全合理的方法可以避免它,我不想这样做。

最佳答案

如果我正确理解你的问题,你可以使用如下的解引用机制:

template<typename T> 
T& dereference(T &v) {
return v;
}

template<typename T>
const T& dereference(const T& v) {
return v;
}

template<typename T>
typename std::enable_if<!std::is_function<T>::value, T&>::type dereference(T* v) {
return dereference(*v);
}

template<typename T>
const T& dereference(const std::shared_ptr<T>& v) {
return dereference(*v);
}

template<typename T>
const T& dereference(const std::weak_ptr<T>& v) {
return dereference(*v);
}

template<typename T>
const T& dereference(const std::reference_wrapper<T>& v) {
return v;
}

然后像这样调用你的数据:

template <typename T>
typename std::enable_if<is_box_containter<T>::value>::type
measure(T const& boxes )
{
for (auto& box : boxes) {
std::cout << dereference(box).id
<< " has volume " << dereference(box).volume() << std::endl;
}
}

LIVE DEMO

P.S 你还必须定义:

template <>
struct is_box_containter <std::vector<Box>> {
enum { value = true };
};

template <>
struct is_box_containter <std::vector<std::reference_wrapper<Box>>> {
enum { value = true };
};

关于c++ - 处理类和类的模板函数*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32991091/

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