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 的代码,但没有成功。
如果确实有可能的话,有谁知道如何实现这一点?
没有帮助者,我成功得到的最接近的是:
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 不接受的演示。