簡體   English   中英

從模板化模板類和可變參數模板中聲明“容器”對象

[英]Declare “container” object from templated template class and variadic templates

我需要聲明一個可以存儲不同種類容器的類。 即,如果它可以處理std :: bitset和std :: array,那就太好了。 但是,這兩個類需要不同的模板參數...是否可以(並且可能如何)使用模板化模板類和可變參數模板來聲明此類?

示例(但錯誤):

template<template <typename..., std::size_t> class Container,
         std::size_t N,
         typename... Args>
class Base_Class
{
    ...
    Container<Args..., N/2> container;
};

編譯器抱怨N / 2不是類型。 顯然,對於std :: array和std :: bitset,我都需要將大小作為最后一個模板參數...是否可以對這種瘋狂進行編碼?

謝謝!

編輯:就我而言,主要問題是可變參數模板只能在右側擴展,因此可變參數必須是最后一個。 有人知道在C ++ 17中是否有任何計划允許以下語法?

template<typename... Args, typename T>
struct A
{};

通過針對ResizedContainer 的規格使用模板模板參數,可以使Anton的答案在特定容器的情況下有所減少:

namespace detail {
    template<typename Container>
    struct ResizedContainer;

    template<template<typename,std::size_t> class Container,
             typename T, std::size_t N>
    struct ResizedContainer<Container<T,N>> {
        using type = Container<T,N/2>;
    };

    template<template<std::size_t> class Container,
             std::size_t N>
    struct ResizedContainer<Container<N>> {
        using type = Container<N/2>;
    };
}

#include <array>
#include <bitset>

template<typename Container>
class Base_Class {
    typename detail::ResizedContainer<Container>::type container;
};

int main() {
    Base_Class<std::array<int,4>> a;
    Base_Class<std::bitset<5>> b;
}

也許是這樣的:

namespace detail {
    template<typename Container>
    struct ResizedContainer;

    template<typename T, size_t N>
    struct ResizedContainer<std::array<T, N>> {
        using type = std::array<T, N/2>;
    };

    template<size_t N>
    struct ResizedContainer<std::bitset<N>> {
        using type = std::bitset<N/2>;
    };
}

template<typename Container>
class Base_Class {
    typename detail::ResizedContainer<Container>::type container;
};

int main() {
    Base_Class<std::array<int, 4>> a;
    Base_Class<std::bitset<5>> b;
}

暫無
暫無

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

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