2015-04-03 40 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

相关问题