c++ - 模板模板、可变参数模板和推导指南:编译器错误?
问题描述
考虑以下大量模板化的代码:
// Preamble
#include <list>
#include <deque>
#include <vector>
#include <iostream>
#include <type_traits>
// Rebind template template type traits
template <class> struct rebind_template_template;
template <template <class...> class Template, class... Types>
struct rebind_template_template<Template<Types...>> {
template <class... Args>
using type = Template<Args...>;
};
// Rebind template parameters type traits
template <class> struct rebind_template_parameters;
template <template <class...> class Template, class... Types>
struct rebind_template_parameters<Template<Types...>> {
template <template <class...> class Arg>
using type = Arg<Types...>;
};
// Template pack
template <template <class...> class... Templates>
class template_pack
{
private:
template <class... Args>
using if_constructible_t = std::void_t<
typename rebind_template_parameters<Args>::template type<Templates>...
>;
public:
template <class... Args, class = if_constructible_t<Args...>>
constexpr template_pack(const Args&...) noexcept {}
};
// Class template argument deduction guide
template <class... Args>
template_pack(const Args&...) -> template_pack<
rebind_template_template<Args>::template type...
>;
// Pretty-printing
template <class Arg>
void print() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
// Main
int main(int argc, char* argv[])
{
template_pack pack(std::list<int>{}, std::deque<int>{}, std::vector<int>{});
print<decltype(pack)>();
return 0;
}
它的作用是从它的参数中推导出一组模板模板。它适用于gcc
8
and 9
,但不适用于clang
。但我不知道这是否是有效的 C++。无所谓,因为它起作用gcc
但不起作用clang
,一个是对的,另一个不是。哪一个是对的?
返回的错误clang
是:
error: pack expansion contains parameter pack 'Args'
that has a different length (3 vs. 1) from outer parameter packs
注意:欢迎任何可以重现问题的更简单的代码。
解决方案
推荐阅读
- perl - 如何将字符串连接到循环内的数组变量并访问数组元素?
- bash - 在 Bash 中包含标点符号的输出行
- unity3d - 儿童对撞机没有被调用
- angular - 将参数传递给路由,我是否正确检索数据?
- html - Opera 浏览器中不显示图标
- java - 每次添加到布局时,JavaFX 图像都会在 Y 轴上下降
- php - 如何将可变数组结构传递给数组
- sql-server - 来自 VB.net 的 SQL 子查询
- spring - 为什么我从 findById() 方法 Spring Data 中获得了乘法数据?
- ios - UITableView swift IOS分组部分中的重复值