是否可以将类型模板捕获到模板参数中?
Is it possible to capture a type template into a template argument?
是否可以从 模板参数中捕获模板 ,即具有包含模板类型的模板参数的嵌套模板说明符?
template< typename T, typename Label = std::string>
class foo {
// ...
};
template <
template < typename C, typename T > typename C<T>,
// ...
typename Label = std::string
>
class bar {
// ...
C< foo< T, Label > > A;
};
例如,我想传递一个通用的 STL 容器 (std::vector< int >
) 作为模板参数,但声明一个具有相同元类型 (std::vector
) 但具有不同值的成员输入 (foo< int >
) 即 std::vector< foo< int > >
。这可能看起来很复杂,但不对 STL 容器的类型进行硬编码会很有帮助。
对于上下文,我的目标是提供一些更高级别功能的通用容器 adapter/wrapper(在 std::stack
或 std::queue
行中)。
是的,您可以只使用模板专业化:
#include <string>
template<typename T, typename Label = std::string>
class foo {};
template <class T, typename Label = std::string>
class bar;
template <template<class...> class C, typename T, typename Label>
class bar<C<T>, Label> {
C<foo<T, Label>> A;
};
另一个答案的方法可以概括为可重用的模板重新绑定器:
template<typename T>
struct rebinder;
template<template<typename...> typename T, typename... Args>
struct rebinder<T<Args...>> {
template<typename... Us>
using rebind = T<Us...>;
};
template<typename T, typename... Us>
using rebound = rebinder<T>::template rebind<Us...>;
// example:
#include <vector>
template<typename T>
struct MyStruct {
rebound<T, float> vec;
};
int main() {
MyStruct<std::vector<int>> x;
static_assert(std::is_same_v<std::vector<float>, decltype(x.vec)>);
}
见 godbolt
是否可以从 模板参数中捕获模板 ,即具有包含模板类型的模板参数的嵌套模板说明符?
template< typename T, typename Label = std::string>
class foo {
// ...
};
template <
template < typename C, typename T > typename C<T>,
// ...
typename Label = std::string
>
class bar {
// ...
C< foo< T, Label > > A;
};
例如,我想传递一个通用的 STL 容器 (std::vector< int >
) 作为模板参数,但声明一个具有相同元类型 (std::vector
) 但具有不同值的成员输入 (foo< int >
) 即 std::vector< foo< int > >
。这可能看起来很复杂,但不对 STL 容器的类型进行硬编码会很有帮助。
对于上下文,我的目标是提供一些更高级别功能的通用容器 adapter/wrapper(在 std::stack
或 std::queue
行中)。
是的,您可以只使用模板专业化:
#include <string>
template<typename T, typename Label = std::string>
class foo {};
template <class T, typename Label = std::string>
class bar;
template <template<class...> class C, typename T, typename Label>
class bar<C<T>, Label> {
C<foo<T, Label>> A;
};
另一个答案的方法可以概括为可重用的模板重新绑定器:
template<typename T>
struct rebinder;
template<template<typename...> typename T, typename... Args>
struct rebinder<T<Args...>> {
template<typename... Us>
using rebind = T<Us...>;
};
template<typename T, typename... Us>
using rebound = rebinder<T>::template rebind<Us...>;
// example:
#include <vector>
template<typename T>
struct MyStruct {
rebound<T, float> vec;
};
int main() {
MyStruct<std::vector<int>> x;
static_assert(std::is_same_v<std::vector<float>, decltype(x.vec)>);
}
见 godbolt