我正在尝试创建一个概念来验证类是否具有特定方法。该约束应仅检查具有此类名称的方法是否存在以及特定返回类型。它不应该对方法的参数施加约束。它可以接受任意数量的参数。
template< typename ExaminedType >
concept ConvertibleToStringObject = requires( ExaminedType instance )
{
{ instance.ToString( ... /* Accept arbitrary number of arguments */ ) } -> SameAs< std::string >;
};
有可能吗?
假设你的
ToString
看起来像类似于
template<typename... Args>
std::string ToString(Args&&...) { return {};}
你可以写一个概念如下。
template<typename ClassT, typename... Args>
concept ConvertibleToStringObject = requires(ClassT instance, Args... args) {
{ instance.ToString(args...) } -> std::same_as<std::string>;
};
例如,您可以在模板函数中使用它
template<typename T, typename... Args>
requires ConvertibleToStringObject<T, Args...>
void func(const T& instance, Args&&... args)
{
// code ..
}