概念中的嵌套类型绑定在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-trum下编译,而是在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需要一个模板作为最后一个模板参数,但您试图传递一个类型。

最新更新