簡體   English   中英

模板參數無效(唯一指針)

[英]Template arguments are invalid (unique pointer)

我正在嘗試制作可動態調整大小的N維數組類。 我的模板化類具有簽名ndarray<typename data_type, int dimensions> 要保存數組,我想使用唯一的指針類成員保存std::vector<type_t>類型std::vector<type_t>的模板化向量,2D std::vector<std::vector<type_t>>std::vector<std::vector<std::vector<type_t>>> std::vector<std::vector<type_t>>用於3d的std::vector<std::vector<std::vector<type_t>>>

根據維數,唯一指針將具有不同的簽名。 我想讓ndarray的類構造函數設置唯一指針的簽名,並使用new來創建新的向量,但是我需要將一個auto成員變量設置為一個不具有成員變量類型的向量工作。 我當前的方法是使用一個模板化函數,該函數返回數組需要為該類型的對象, template<typename data_type> auto dimension_helper(int dimensions) ,然后設置唯一的指針簽名,例如std::unique_ptr<decltype(<data_type>dimension_helper(dimens))> array 這也行不通,給我的錯誤是在唯一指針內模板參數1無效,模板參數2無效。

我該怎么做才能使現有代碼正常工作,或者有更好的方法以類似的方式解決問題?

代碼樣本

標頭

#ifndef ND_H_
#define ND_H_
#include <cstring>
#include <vector>
#include <memory>


namespace NdArray{
    //use the following for dimension types 
    template<typename T>
    using d1 = std::vector<T>;
    template<typename T>
    using d2 = std::vector<d1<T>>;
    template<typename T>
    using d3 = std::vector<d2<T>>;
    template<typename T>
    using d4 = std::vector<d3<T>>;
    template<typename T>
    using d5 = std::vector<d4<T>>;

    template<typename data_type>
    auto dimension_helper(int dim);



    template<typename data_type,int dimensions>
    class ndarray{
            int dims;
            std::unique_ptr<std::vector<int>> xsub_spans;

        public:
            ndarray();
            ~ndarray();
            std::unique_ptr<decltype(<data_type>dimension_helper(dimensions))> array;

            template<typename dat_type, int dim>
            friend std::ostream& operator<<(std::ostream& , ndarray<dat_type, dim>&);
    };

}


#endif

到目前為止的定義

#include "nd.h" 
using namespace NdArray;

template<typename data_type, int dimensions>
ndarray<data_type, dimensions>::ndarray(){
    dims = dimensions;
    array = new <data_type>dimension_helper(dimensions); 
}

template<typename data_type>
auto dimension_helper(){
    switch (dims) {
        case 1 : {
            d1<data_type> type;
            return type;
            break;
        }
        case 2 : {
            d2<data_type> type;
            return type;
            break;
        }
        case 3 : {
            d3<data_type> type;
            return type;
            break;
        }
        case 4 : {
            d4<data_type> type;
            return type;
            break;
        }
        case 5 : {
            d5<data_type> type;
            return type;
            break;
        }
    }
}

模板參數列表位於模板名稱之后,因此:

dimension_helper<data_type>(dimensions)

代替

<data_type>dimension_helper(dimensions)

但是,您的“維輔助程序”沒有機會工作,因為switch語句是運行時分支,並且由於return語句中的表達式類型不相等而無法編譯。 相反,您可以按以下方式重寫它:

template <typename T>
struct identity { using type = T; };    
template <typename T, std::size_t D>
struct dimension_helper : identity<std::vector<typename dimension_helper<T, D-1>::type>> {};
template <typename T>
struct dimension_helper<T, 0> : identity<T> {};
template <typename T, std::size_t D>
using dimension_helper_t = typename dimension_helper<T, D>::type;

並聲明您的指針為:

std::unique_ptr<dimension_helper_t<data_type, dimensions>> array;

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM