C++ boost的容器::相同类型但维度不同的多_数组

C++ boost的容器::相同类型但维度不同的多_数组,c++,templates,boost,boost-multi-array,C++,Templates,Boost,Boost Multi Array,我需要的是创建一个类,该类可以容纳相同类型但维度不同的boost::multi_数组 假设有一个或多个这样的双精度数组 boost::multi_array<double, 2> array_2d; //2D array boost::multi_array<double, 3> array_3d; //4D array boost::multi_array<double, 4> array_4d; //5D array etc... boost::mult

我需要的是创建一个类,该类可以容纳相同类型但维度不同的boost::multi_数组

假设有一个或多个这样的双精度数组

boost::multi_array<double, 2> array_2d; //2D array
boost::multi_array<double, 3> array_3d; //4D array
boost::multi_array<double, 4> array_4d; //5D array
etc...
boost::multi_array_2d//二维阵列
boost::multi_array_3d//4D阵列
boost::多_阵列_4d//5D阵列
等
我需要一个容器类,它可以容纳上述所有类型,以便在以后需要时遵循正确的类型

差不多

GenericArray<double> arr;
arr.IsEmpty() // check if it has valid ref
arr.assign(array_2d); //set reference to
GenericArray-arr;
arr.IsEmpty()//检查它是否有有效的ref
arr.assign(数组_2d)//引用
然后使用某种模板逻辑返回对数组的引用

try{
    boost::multi_array<double, 2>& array_2d_ref = arr.get<2>
    //OR
    boost::multi_array<double, 2>& array_2d_ref = arr.get<multi_array<double, 2>>
    // First one look cleaner tho
}catch (ArrayDimentinalityMismatch e){

}
试试看{
boost::multi_数组和array_2d_ref=arr.get
//或
boost::multi_数组和array_2d_ref=arr.get
//第一个看起来更干净
}捕获(阵列基本匹配){
}
在同一代码块中

arr.assign(array_3d);

try{
    boost::multi_array<double, 2>& array_3d_ref=arr.get<multi_array<double, 3>>
}catch (ArrayDimentinalityMismatch e){

}
arr.assign(数组_3d);
试一试{
boost::multi_数组&数组_3d_ref=arr.get
}捕获(阵列基本匹配){
}

这是否可能使用模板?

首先,我认为您可能需要评估您的设计。与函子一样,很少需要围绕泛型类型参数编写半刚性类型包装器

但是,如果您确实发现需要这样做,这里有一个使用
boost::variant

template <typename T>
struct GenericArray
{
    template <size_t N> using array_t = boost::multi_array<T, N>;

    template <typename Rhs> GenericArray& operator=(Rhs&& rhs) {
        _storage = std::forward<Rhs>(rhs);
        return *this;
    }

    template <size_t N> array_t<N>      & get()       { return boost::get<array_t<N> >(_storage); }
    template <size_t N> array_t<N> const& get() const { return boost::get<array_t<N> >(_storage); }

  private:
    typename detail::make_generic_array_storage<T>::type _storage;
};
没有什么太复杂的,如果你从高层次来看:)

下一步:演示!查看它

GenericArray<double> arr;
arr = array_3d;

try { auto& ref3 = arr.get<3>(); }
catch (boost::bad_get const& e) { std::cout << "L:" << __LINE__ << " " << e.what() << "\n"; }

try { auto& ref2 = arr.get<2>(); } // this fails
catch (boost::bad_get const& e) { std::cout << "L:" << __LINE__ << " " << e.what() << "\n"; }

arr = array_2d;

try { auto& ref2 = arr.get<2>(); } // this succeeds
catch (boost::bad_get const& e) { std::cout << "L:" << __LINE__ << " " << e.what() << "\n"; }

std::cout << "Done";
正如所料


奖励:要在变体存储上实现更多类似阵列的操作,请查看以下内容:


关于这个主题的哪个部分

Hay see他可以将其转换为不使用c++11的版本。im使用vs2010Sure:(只是用等效的
typedef
s替换了
using
,并删除了移动语义)
GenericArray<double> arr;
arr = array_3d;

try { auto& ref3 = arr.get<3>(); }
catch (boost::bad_get const& e) { std::cout << "L:" << __LINE__ << " " << e.what() << "\n"; }

try { auto& ref2 = arr.get<2>(); } // this fails
catch (boost::bad_get const& e) { std::cout << "L:" << __LINE__ << " " << e.what() << "\n"; }

arr = array_2d;

try { auto& ref2 = arr.get<2>(); } // this succeeds
catch (boost::bad_get const& e) { std::cout << "L:" << __LINE__ << " " << e.what() << "\n"; }

std::cout << "Done";
L:58 boost::bad_get: failed value get using boost::get
Done