“转换为某种T匹配概念C”从根本上是不可能的,编译器不会检查所有可能的转换目标。
“衰减到类型匹配概念C”是可能的,但不是用最漂亮的语法。
不可能
DecaysTo<std::convertible_to<float>>
因为概念不能作为模板参数传递。但是可以传递特征:
template <typename T, template <typename...> typename Trait, typename ...P>
concept DecaysTo = Trait<std::decay_t<T>, P...>::value;
然后:
{ t.bar } -> DecaysTo<std::is_convertible, float>;
或者,一种不那么复杂的方法是:
template<typename T>
concept HasBar = requires(T t)
{
requires std::convertible_to<std::decay_t<decltype(t.bar)>, float>;
};
或者,你可以通过强制表达式衰减来作弊,例如:
template<typename T>
concept HasBar = requires(T t)
{
{ auto(t.bar) } -> std::convertible_to<float>;
};
但这需要
bar
可复制性,所以国际海事组织认为情况更糟。