是否可以将类型模板捕获到模板参数中?

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::stackstd::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;
};

Demo.

另一个答案的方法可以概括为可重用的模板重新绑定器:

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