c++ - 概念中的嵌套类型绑定在 GCC 和 clang 上失败,但在 msvc 上失败
问题描述
这段代码:
template<typename T, template<typename> typename Pred>
concept sats_pred = static_cast<bool>(Pred<T>::value);
template<template<typename...> typename A, template<typename> typename Cond>
struct is_container_of_helper {
template<sats_pred<Cond>... Ts>
void operator()(const A<Ts...>&) const
{}
};
template<typename T>
struct always_true {
static constexpr bool value = true;
};
template<typename T, template<typename...> typename Container, template<typename> typename Cond>
concept is_container_of_if = requires(const T& v, const is_container_of_helper<Container, Cond>& h)
{
h(v);
};
template<typename T, template<typename...> typename A>
concept is = is_container_of_if<T, A, always_true>;
template<template<typename...> typename A>
struct is_a {
template<typename T>
struct type {
static constexpr bool value = is<T, A>;
};
};
template<typename T, template<typename...> typename Contained, template<typename...> typename Container>
concept is_container_of = is_container_of_if<T, Container, typename is_a<Contained>::type>;
不在 gcc 或 clang trunk 下编译,但在 msvc ( godbolt ) 下编译。在 gcc/clang 下它给出
expected a class template, got 'typename is_a<Contained>::type
此代码有效吗?如果没有,有没有办法用有效代码实现同样的事情,为什么 msvc 编译它?
解决方案
像这样更改代码的最后一部分:
template<typename T, template<typename...> typename Contained, template<typename...> typename Container>
concept is_container_of = is_container_of_if<T, Container, is_a<Contained>::template type>;
它在 clang 和 gcc 中编译。is_container_of_if
最后一个模板参数需要一个模板,但您试图传递一个类型。
推荐阅读
- javascript - 用于库的 Angular CLI 6.x 环境文件
- java - 未找到匹配索引 - GAE
- c# - 在聚合目录中使用后无法删除目录
- android - 我如何将数据变量同时发送到多个活动?
- javascript - 具有固定标题和固定第一列的可滚动表
- string - String.sub 的性能和陷阱是什么
- php - Laravel 5.6 下载文件 ajax
- java - Get All User timeline tweets using twitter4j and java
- julia - julia微分方程中多个数据集的参数估计
- class - 使用 size_t 类型变量初始化模板构造函数