C++ 处理类和类的模板函数*

C++ 处理类和类的模板函数*,c++,c++11,boost,stl,metaprogramming,C++,C++11,Boost,Stl,Metaprogramming,下面的代码允许我对函数进行模板化 获取一个参数,该参数是指向长方体对象的三种不同指针类型之一的向量: const std::vector<std::shared_ptr<Box>>& const std::vector<std::weak_ptr<Box>>& const std::vector<Box*>& 常量std::vector& 常数std::向量& 常数std::向量& 是否有办法扩展此功能以支持

下面的代码允许我对函数进行模板化 获取一个参数,该参数是指向长方体对象的三种不同指针类型之一的向量:

const std::vector<std::shared_ptr<Box>>&
const std::vector<std::weak_ptr<Box>>&
const std::vector<Box*>&
常量std::vector& 常数std::向量& 常数std::向量& 是否有办法扩展此功能以支持:

const vector<Box>& 
const vector<std::reference_wrapper<Box>>
const向量&
常数向量
也许有什么好消息

#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;
}
#包括
#包括
类框{
公众:
框(无符号int-id,无符号int-side):id(id),side(side){
int卷(){
返回侧*侧*侧;
}
无符号整数id;
无符号整数侧;
};
模板
结构为箱型容器{
枚举{value=false};
};
模板
结构为箱型容器{
枚举{value=true};
};
模板
结构为箱型容器{
枚举{value=true};
};
模板
结构为箱型容器{
枚举{value=true};
};
模板
typename std::enable_if::type
测量(T常数和盒)
{
用于(自动框:框(&B){

std::cout id如果我正确理解了您的问题,您可以使用如下的解引用机制:

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;
}
模板
T&D参考(T&v){
返回v;
}
模板
常数T&D参考(常数T&v){
返回v;
}
模板
typename std::enable_if::value,T&>::类型取消引用(T*v){
返回解引用(*v);
}
模板
常数T&D参考(常数标准::共享的ptr&v){
返回解引用(*v);
}
模板
常数T&D参考(常数标准::弱ptr&v){
返回解引用(*v);
}
模板
常数T和解引用(常数标准::引用包装器和v){
返回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;
    }
}
模板
typename std::enable_if::type
测量(T常数和盒)
{
用于(自动框:框(&B){

std::你基本上想知道vasriable是否来自于类型
向量&
?我不认为这是我的意思,我想知道是否有一种方法可以模板化一个可以同时处理Class和Class*的函数,来编写将被解释为box->id或box.id的代码(视情况而定)boost库的第二个问题。事实上,我想知道这是否只是一个我不知道正确词汇的问题,所以我没有足够的谷歌搜索。你是否尝试过加载?我没有试图过载,我认为这是可能的。你的评论帮助我意识到我的问题可能不是100%清楚,所以我拒绝了我有两个几乎相同的方法,具有复杂的逻辑。一个用list调用,另一个用vector调用。我希望能够实现一次逻辑。我可能能够重构代码以使用它
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 };
};