簡體   English   中英

獲取std :: vector / std :: array的維數

[英]Getting the number of dimensions of a std::vector/std::array

假設我想要一個class/struct類型,它繼承自integral_constant<size_t, N> ,其中N是維,並且維實現如下:

template<class T>
struct dimension;

template<class T>
struct dimension<vector<T>> : integral_constant<size_t, 1> {};

template<class T>
struct dimension<vector<vector<T>>> : integral_constant<size_t, 2> {};

接着

cout << dimension<vector<int>>::value;         // 1
cout << dimension<vector<vector<int>>>::value; // 2

但是顯然這不是完美的,因為維數可以是無限的(理論上)。 有沒有辦法實現通用解決方案?

建議:我朝這個方向走,但沒有進一步:

template<class T, class... Tn>
struct dimension<vector<Tn...>> : integral_constant<size_t, sizeof...(Tn)> {};

由於std::vector具有其他模板參數,因此無法使用。

定義“什么是容器”有點困難。 下面檢查value_typeiteratorconst_iterator嵌套的typedef。 根據需要調整void_t檢查。 (例如,如果只希望將可以下標的內容識別為容器,則將decltype(std::declval<T&>()[0])到列表中。)

請注意, dimension_impl的專業化稱為dimension 這使您可以將dimension專門用於您不希望被視為容器的類似容器的事物(想到std::string )。

template<class T> struct dimension;

namespace details {    
    template<class T, class = void>
    struct dimension_impl {
        static constexpr std::size_t value = 0;
    };

    template<class T>
    struct dimension_impl<T, std::void_t<typename T::value_type,
                                         typename T::iterator,
                                         typename T::const_iterator>> {
        static constexpr std::size_t value = 1 + dimension<typename T::value_type>::value;
    };
}

template<class T>
struct dimension : std::integral_constant<std::size_t, 
                                          details::dimension_impl<T>::value> {};

您可以為做到這一點std::vector (注意的模板參數列表std::vector比1以上):

template<typename T>
struct dimension { static constexpr std::size_t value = 0; };

template<typename T, typename... V>
struct dimension<std::vector<T, V...>>{
    static constexpr std::size_t value = 1 + dimension<T>::value;
};

這適用於std::array

template<typename>
struct dimension { static constexpr std::size_t value = 0; };

template<typename T, std::size_t N>
struct dimension<std::array<T, N>>{
    static constexpr std::size_t value = 1 + dimension<T>::value;
};

它遵循一個最小的有效示例:

#include<vector>
#include<iostream>

template<typename T>
struct dimension { static constexpr std::size_t value = 0; };

template<typename T, typename... V>
struct dimension<std::vector<T, V...>>{
    static constexpr std::size_t value = 1 + dimension<T>::value;
};

int main() {
    std::cout << dimension<std::vector<std::vector<int>>>::value << std::endl;
}

暫無
暫無

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

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