Вы не должны писать такие концепции. Концепция никогда не должна проверять что-либо, как указано c как функцию-член с точной подписью. Вместо этого концепция должна сказать, что, учитывая экземпляр рассматриваемого типа, я должен быть в состоянии сделать i.memberFunc(...)
, где ...
- список параметров.
Например, ваша концепция "IRealization" (пожалуйста, не используйте префиксы для I
. Понятия - это , а не интерфейсы). Следует сказать, что "T
должен иметь функцию-член, которая может быть вызвана с помощью аргумента std::string
и приводит к чему-то, что конвертируется в int
. " Это будет выглядеть так:
template <typename T>
concept IRealization = requires(T t, std::string str)
{
{ t.TestMethod(str) } -> convertible_to<int>;
};
Это позволяет пользователю предоставить TestMethod
, который принимает, например, std::string_view
вместо std::string
. Нет смысла быть таким невероятно ограничительным для типа.
Концепция, проверяющая наличие в 1011 * функции-члена, которая может вызываться с каким-либо типом U
, должна была бы быть шаблонной как для T
, так и для U
:
template <typename T, typename U>
concept IRealization = requires(T t, U u)
{
{ t.TestMethod(u) } -> convertible_to<int>;
};