我有一个有两个参数的函数模板。我需要确保传递给它的类型模板参数可以使用
operator>>( std::istringstream& iss, T& value )
提取。
一个最小的例子:
template <class T>
std::istringstream&
extract_field_from_line( std::istringstream& iss, T& value )
{
// ...
iss >> value;
return iss;
}
我提出了以下概念:
template <class T, class S>
concept extractable_from = requires ( S& stream, T& value )
{
{ stream >> value } -> std::same_as<S&>;
};
所以这样的事情是可能的:
template <class T>
requires( extractable_from<T, std::istringstream> )
std::istringstream&
extract_field_from_line( std::istringstream& iss, T& value )
{
// ...
iss >> value;
return iss;
}
这个概念是否足够且合理?这里有什么可以改进的吗?
这个概念足够且合理吗?
是的,它看起来不错,因为用户定义了
operator>>
或类似的功能,例如正确实现的 extract_field_from_line
。
假设
extractable_from
概念用户忘记通过左值引用传递value
,该概念无法识别,因此会出现错误。