运算符>>和流的自定义 extractable_from 概念

问题描述 投票:0回答:1

我有一个有两个参数的函数模板。我需要确保传递给它的类型模板参数可以使用

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

这个概念是否足够且合理?这里有什么可以改进的吗?

c++ operator-overloading c++-concepts c++23 istringstream
1个回答
0
投票

这个概念足够且合理吗?

是的,它看起来不错,因为用户定义了

operator>>
或类似的功能,例如正确实现的
extract_field_from_line

假设

extractable_from
概念用户忘记通过左值引用传递
value
,该概念无法识别,因此会出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.