Пусть ss будет std :: stringstream. Как указать концепцию для (сс < - PullRequest
2 голосов
/ 05 марта 2020

Пусть ss будет std :: stringstream. Как определить концепцию для (ss << some_type) .str () является std :: string? </p>

Вот код, который у меня есть:

#include <iostream>
#include <sstream>

namespace detail {
    template< class T, class U >
    concept SameHelper = std::is_same_v<T, U>;
}

template< class T, class U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;

template<typename T>
concept ssToStr = requires(T a, std::stringstream ss) {
    { (ss << a).str() } -> same_as<std::string>;
};

void call(ssToStr auto obj)
{
    std::stringstream ss;
    std::cout << (ss << obj).str() << std::endl;

}

int main() 
{
    call("Hi");
    return 0;
}

Вы можете проверить онлайн, что код не компилируется. Первая часть сообщений об ошибках гласит:

<source>:25:5: error: no matching function for call to 'call'

    call("Hi");

    ^~~~

Ответы [ 2 ]

3 голосов
/ 05 марта 2020

Вы пропустили #include <sstream>

Исправление, которое выдает сообщение об ошибке, которое содержит:

<source>:14:17: note: because '(ss << a).str()' would be invalid: no member named 'str' in 'std::basic_ostream<char>'

    { (ss << a).str() } -> same_as<std::string>;

, который говорит вам, что (ss << obj) оценивается как std::ostream, что делает не имеет .str() участника. Все, что вам нужно проверить, это то, что ss<<a компилируется, и вы уже знаете, что ss.str() приводит к строке, поэтому вам не нужно это в своем ограничении.

К сожалению, я не знаю достаточно об ограничениях для создания рабочего кода для вас.

1 голос
/ 05 марта 2020

Благодаря Mooing Duck Я смог запустить код. Рабочий код гласит:

#include <iostream>
#include <sstream>

template<typename T>
concept ssToStr = requires(T a, std::stringstream ss) {
    { ss << a };
};

void call(ssToStr auto obj)
{
    std::stringstream ss;
    ss << obj;
    std::cout << ss.str() << std::endl;
}

int main() 
{
    call("Hi");
    return 0;
}

Вы можете запустить код онлайн

...