【发布时间】:2016-01-04 14:49:32
【问题描述】:
下面的代码允许我模板化一个函数 获取一个参数,该参数是 Box 对象的三种不同指针类型之一的向量:
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>>
也许有什么提升?
#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 的指针向量。 我目前正计划重构代码以将 SomeClass 列表替换为指向 SomeClass 的共享指针列表。但我这样做的唯一原因是将逻辑移至通用实现。如果有完全合理的方法来避免它,我不想这样做。
【问题讨论】:
-
你基本上想知道变量是否来自
vector<Box>&类型? -
我不认为这就是我的意思,我想知道是否有一种方法可以对一个可以同时处理 Class 和 Class* 的函数进行模板化,以编写将被解释为的代码box->id 或 box.id 视情况而定。似乎是其他人会遇到的问题,提升库所写的那种问题。实际上我想知道这是否只是一个我不知道正确词汇的问题,所以我没有充分搜索。
-
您是否尝试过重载?
-
我并没有尝试超载它,我认为它可以使它工作。您的 cmets 正在帮助意识到我的问题可能不是 100% 清楚,因此我可能会在此之后对其进行编辑。我有两个几乎相同的方法,具有复杂的逻辑。一个用 list
调用,另一个用 vector 调用。我希望能够实现一次逻辑。我也许可以重构代码以使用 <:list>> 和 std::vector<:weak_ptr>>。但是如果没有必要,不想做所有的重构
标签: c++ c++11 boost stl metaprogramming