是否有一种 C++20 方法可以仅使用概念和 require() 来检测类型是否是模板的实例化?

mci*_*oni 4 c++ sfinae c++-concepts c++20

多年来,我总是使用以下代码来检测任意类型是否是模板实例化:

namespace priv {
    template <typename, template <typename...> typename>
    struct _is_instance_impl : public std::false_type {};

    template <template <typename...> typename U, typename...Ts>
    struct _is_instance_impl<U<Ts...>, U> : public std::true_type {};
}

template <typename T, template <typename ...> typename U>
using is_instance = priv::_is_instance_impl<std::decay_t<T>, U>;
Run Code Online (Sandbox Code Playgroud)

这也适用于 C++20 概念:

template <typename T, template <typename ...> typename U>
concept instance_of = priv::_is_instance_impl<std::decay_t<T>, U>::value;

template <typename T>
std::size_t len_of(T &&s) requires instance_of<T, std::basic_string> {
        return s.length();
}
Run Code Online (Sandbox Code Playgroud)

我尝试用 C++20requires()表达式替换这个基于 SFINAE 的代码,但没有成功。

如果确实有可能的话,有谁知道如何实现这一点?

Jar*_*d42 5

没有帮助者,我成功得到的最接近的是:

template <class T, template <typename...> class C>
concept test = requires (T t)
{
    {[] <typename... Ts>(C<Ts...>& c) -> C<Ts...>& { return c; }(t)} -> std::same_as<T&>;

    // simplified version, but allows conversion
    //[] <typename... Ts>(C<Ts...>&) {}(t);
};
Run Code Online (Sandbox Code Playgroud)

不过 clang 不接受的演示。