Концепция функции-члена, принимающей параметр шаблона в C ++ 20

Я хотел бы иметь концепцию

struct creatorclass {
  template<typename T>
  int fct(T val)
  {
    return 42;
  }
};

Мне нужна концепция, которая проверяет наличие функции fct без указания параметра шаблона. Это хочу иметь

template<typename U>
concept CREATOR=requires(U val) {
  val.fct;
};

Я думаю, что это невозможно, так как концепция должна быть оценена и скомпилирована. Это невозможно сделать, не зная класса T. Я прав?

Примечание. Concept для типа, который имеет шаблон функции-члена с использованием Concepts Lite, также говорит, что это невозможно, но это было сделано для concept-lite шесть лет назад, до стандарта C ++ 20.


person Mathieu Dutour Sikiric    schedule 14.04.2021    source источник
comment
Да это невозможно.   -  person HolyBlackCat    schedule 14.04.2021
comment
Непонятно, что именно вы хотите ... хотите ли вы проверить наличие универсальной функции (ноль или более аргументов; шаблон или нет)? Или наличие функции-шаблона, получающей ровно один аргумент (типа шаблона)? Или что еще?   -  person max66    schedule 14.04.2021
comment
Это зависит от сигнатуры функции-члена fct. Чтобы проверить его существование, вам нужно знать, как его вызвать или сколько параметров он принимает, и какого типа эти параметры.   -  person super    schedule 14.04.2021
comment
поскольку шаблоны могут быть специализированными или ограниченными, вам нужно будет более конкретно указать в своей концепции, как вы будете вызывать fct (например, какой тип?)   -  person AndyG    schedule 14.04.2021
comment
Я не думаю, что этот вопрос был закрыт с подходящей целью для обмана.   -  person dfrib    schedule 14.04.2021
comment
@dfrib: Почему бы и нет? Внизу есть один и тот же вопрос: пользователь хочет написать ограничение, которое включает в себя тип, который не является частью ограничения. Ограничения не могут этого сделать.   -  person Nicol Bolas    schedule 14.04.2021
comment
@NicolBolas В этом конкретном случае я бы сказал, что существующий ответ на этот Q фактически предоставляет ответ (на концепцию, которая проверяет существование функции fct без указания параметра шаблона [...] без зная класс T), используя тот же подход, что и, например, в этом разделе вопросов и ответов. Ни один из ответов в связанных с дубликатами ответов не спрашивает об ограничении шаблонов функций-членов, и ответы не показывают, что вы можете (из-за несколько экзотического использования ключевого слова .template ...). Я бы сказал, что темы связаны, а не обманывают.   -  person dfrib    schedule 14.04.2021
comment
... но давайте посмотрим, что говорит ОП; Моя интерпретация заключается в том, что без указания параметра шаблона здесь возникает путаница, и что основной вопрос заключается в том, что не знает класса T.   -  person dfrib    schedule 14.04.2021
comment
@dfrib: OP сказал: Мне нужна концепция, которая проверяет существование функции fct без указания параметра шаблона.   -  person Nicol Bolas    schedule 14.04.2021
comment
@dfrib: что корень - это «без знания класса T» Если это без концепции, знающей о T, то это та же проблема. Проблема в том, что концепция должна знать, что существует параметр шаблона, и заполнять его, поэтому, если это может быть любой тип, концепция должна быть частью его параметров шаблона.   -  person Nicol Bolas    schedule 14.04.2021
comment
@NicolBolas Я думаю, что OP (учитывая двойственность его утверждений) находится после того, что предоставил существующий ответ, который действительно указывает параметр шаблона, но моя интерпретация заключается в том, что это предложение - отвлекающий маневр в (не совсем точно сформулированный вопрос). Знание класса T не использует нормативную формулировку и может быть простой формулировкой для без указания конкретных аргументов шаблона для параметра шаблона T. Но только OP знает, так что давайте посмотрим, сможет ли он вернуться и либо обновить вопрос (удалить дублирование?), Либо доволен целями обманки.   -  person dfrib    schedule 14.04.2021
comment
... Или, каковы ответы OP на вопросы @ max66 выше.   -  person dfrib    schedule 14.04.2021


Ответы (1)


Насколько мне известно, невозможно проверить функцию-член шаблона без оценки каких-либо параметров шаблона.

Тем не менее, если у вас есть представление о том, какой может быть классификация входных данных - например, если функция может быть оценена только с помощью целочисленных значений или чего-то подобного - тогда вы можете протестировать это с явным экземпляром, который может быть «достаточно хорошим» для любых ваших целей:

template<typename U>
concept CREATOR=requires(U val) {
  // Checks that 'val' has a 'fct' function template that works with integers
  val.template fct<int>(5); 
};

Живой пример

В большинстве случаев, однако, обычно более полезно определять концепцию вокруг полного атомарного определения, необходимого для выполнения ее контракта - в этот момент обычно лучше перенести эту оценку также на аргумент template:

template <typename T, typename U>
concept fnc_evaluatable = requires(T val, U in) {
    val.template fct<U>(in);
};

И затем использовать это в больших композициях.

На этом этапе состояние fnc, являющегося шаблоном, также становится менее важным, чем его состояние с вызовом функции-члена fct, вызываемой U - и, вероятно, может быть упрощено до простого:

template <typename T, typename U>
concept fnc_evaluatable = requires(T val, U in) {
    val.fct(in);
};
person Human-Compiler    schedule 14.04.2021