LinuxC/C++编程基础(2) 基于boost::any构建数据容器

来源:互联网 发布:网络加密怎么破解密码 编辑:程序博客网 时间:2024/06/06 00:42

一.DataContainer.h头文件的声明,如下:

#ifndef DATA_CONTAINER_H
#define DATA_CONTAINER_H
#include <vector>
#include <boost/any.hpp>
class DataContainer{
public:
    void push(boost::any _any);
    boost::any get(int index);
    size_t size();
private:
    std::vector<boost::any> _vector;
};
inline void DataContainer::push(boost::any _any){
    _vector.push_back(_any);
}
inline boost::any DataContainer::get(int index){
    if(index < size()){
        return _vector[index];
    }else{
        return 0;
    }
}
inline size_t DataContainer::size(){
    return _vector.size();
}
#endif

二.DataAuxiliary.h头文件的声明,如下:

#ifndef DATA_AUXILIARY_H
#define DATA_AUXILIARY_H
#include <iostream>
#include "DataContainer.h"

class DataAuxiliary{
public:
    static bool getBool(DataContainer& container,int index);//这里只声明并实现了3种数据类型,当然有需要的话,
    static int getInt(DataContainer& container,int index);//可以自己扩展其他数据类型,或者自定义类型,比如自己声明的类
    static std::string getString(DataContainer& container,int index);
private:
    DataAuxiliary(){}
};

#endif

三.DataAuxiliary.cpp的实现,如下:

#include "DataAuxiliary.h"
bool DataAuxiliary::getBool(DataContainer& container,int index){
    try{
        return boost::any_cast<bool>(container.get(index));//基于boost::any_cast读取存储在any中的数据
    }catch(boost::bad_any_cast& e){
        throw e;
    }
    return false;
}

int DataAuxiliary::getInt(DataContainer& container,int index){
    try{
        return boost::any_cast<int>(container.get(index));
    }catch(boost::bad_any_cast& e){
        throw e;
    }
    return 0;
}


std::string DataAuxiliary::getString(DataContainer& container,int index){
    try{
        return boost::any_cast<std::string>(container.get(index));
    }catch(boost::bad_any_cast& e){
        throw e;
    }
    std::string empty = std::string("");
    return empty;
}

四.main.cpp函数的实现,如下:

#include "DataContainer.h"
#include "DataAuxiliary.h"
#include <iostream>
int main(int argc,char** argv){
    DataContainer container;
    container.push(boost::any(55));
    container.push(boost::any(true));
    container.push(boost::any(std::string("something")));
    int num = DataAuxiliary::getInt(container,0);
    bool flag = DataAuxiliary::getBool(container,1);
    std::string str = DataAuxiliary::getString(container,2);
    std::cout<<num<<std::endl;
    std::cout<<str<<std::endl;
    if(flag){
        std::cout<<"true"<<std::endl;
    }else{
        std::cout<<"false"<<std::endl;
    }
    return 0;
}

转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8204842



原创粉丝点击