gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:43:45 26 4
gpt4 key购买 nike

多年来,我一直使用下面这段代码来检测任意类型是否是模板实例化:

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>;

这也适用于 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();
}

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

有没有人知道如何实现这一点,如果真的有可能的话?

最佳答案

没有助手,我最接近的成功是:

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);
};

Demo clang 不接受。

关于c++ - 是否有一种 C++20 方法可以仅使用概念和 requires() 来检测类型是否是模板的实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67304302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com