2015-04-03 39 views
5

我需要聲明一個可以存儲不同類型容器的類。即如果它可以處理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,我需要size是最後一個模板參數......是否有可能編寫這個瘋狂?

謝謝!

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

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

哪種編譯? – Walter 2015-04-03 09:57:10

+0

它給g ++和clang都帶來錯誤(顯然使用-std = C++ 11/14參數) – dodomorandi 2015-04-03 10:04:03

回答

3

安東的回答可以製成稍差容器特定使用模板的模板參數的ResizedContainer的speciliasations

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; 
} 
2

也許是這樣的:

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; 
} 
+0

這很不錯。無論如何,這是相當容器特定的。任何想法,以避免模板專業化和寫下一個完整的通用模板類? – dodomorandi 2015-04-03 09:59:08

+1

@dodomorandi我認爲你不能。 C++語法不允許它。 – 2015-04-03 10:03:54

+0

@AntonSavin * C++語法不允許它。*我懷疑你是對的,但你能證明這一點嗎? – Walter 2015-04-03 10:07:45

相關問題