从模板化模板 class 和可变模板中声明 "container" 对象
Declare "container" object from templated template class and variadic templates
我需要声明一个 class 可以存储不同类型的容器。即,如果它可以处理 std::bitset 和 std::array 就好了。
但是,这两个 classes 需要不同的模板参数...
是否有可能(以及可能如何)使用模板化模板 classes 和可变参数模板来声明这种 class?
示例(但错误):
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
{};
也许是这样的:
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;
}
Anton 的答案可以container-specific 通过使用模板模板参数来ResizedContainer
:
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;
}
我需要声明一个 class 可以存储不同类型的容器。即,如果它可以处理 std::bitset 和 std::array 就好了。 但是,这两个 classes 需要不同的模板参数... 是否有可能(以及可能如何)使用模板化模板 classes 和可变参数模板来声明这种 class?
示例(但错误):
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
{};
也许是这样的:
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;
}
Anton 的答案可以container-specific 通过使用模板模板参数来ResizedContainer
:
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;
}