从结构中获取所有可变参数模板类型,该结构是函数模板中的类型参数

Get all variadic template types from a struct which is a type parameter in function template

这是一个最小的例子:

template<typename ...Types>
struct Pack {};

template<typename ...TemplateTemplateTypes>
bool AllConstructible()
{
    return (std::is_constructible_v
            </*do something to archive all types in every TemplateTemplateType*/> 
            and ... and true);
}

struct Empty{};

int main()
{
    std::cout << std::boolalpha << AllConstructible<Pack<int, const int&>, Pack<Empty>>();
}

函数 AllConstructible 将 return 为真,前提是所有 is_constructible_v<Pack's Types> 都为真。

Pack的定义里面实现所有类型很容易(用Types...),但是在外面怎么实现呢?

您可以侵入一个无法解压参数的辅助模板:

template<typename ...Types>
struct Helper;

template<typename ...Types>
struct Helper<Pack<Types...>>
{
    static constexpr bool value{std::is_constructible_v<Types...>};
};

template<typename ...TemplateTemplateTypes>
bool AllConstructible()
{
    return (Helper<TemplateTemplateTypes>::value and ... and true);
}