Ограничение coroutine_traits для ClassType при поддержке лямбда-выраженийC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ограничение coroutine_traits для ClassType при поддержке лямбда-выражений

Сообщение Anonymous »

В настоящее время я пишу библиотеку coroutine/promise, которая работает с co_await, и у меня возникают трудности с ограничением coroutine_traits для функций-членов, когда есть несвязанные лямбда-выражения, возвращающие тип задачи.
Пример, воспроизводящий проблему в Godbolt:

Код: Выделить всё

#include 
#include 
#include 

template
class TaskType {
};

class SomeSafeClassA {};
class SomeSafeClassB {};

template
concept IsSafeClassA = std::is_base_of_v;
template
concept IsSafeClassB = std::is_base_of_v;

namespace std {

template
struct coroutine_traits{
using promise_type = TaskType;
};

template
struct coroutine_traits{
using promise_type = TaskType;
};

template
struct coroutine_traits{
using promise_type = TaskType;
};

}

int main()
{
auto k = []() -> TaskType {
co_return 6;
};
}
Очевидно, что TaskType здесь реализован не полностью (он есть в реальной версии). Проблема в ошибке компиляции:

Код: Выделить всё

.../type_traits:3514:60: error: incomplete type 'const (lambda at :38:14)' used in type trait expression
3514 |   inline constexpr bool is_base_of_v = __is_base_of(_Base, _Derived);
|                                                            ^
:13:29: note: in instantiation of variable template specialization 'std::is_base_of_v' requested here
13 | concept IsSafeClassA = std::is_base_of_v;
Теперь лямбда — если бы она была полным типом — в любом случае не прошла бы тест is_base_of. Я хочу, чтобы лямбды соответствовали первой специализации шаблона; вот этот:

Код: Выделить всё

template
struct coroutine_traits{
using promise_type = TaskType;
};
без возникновения ошибки компилятора из-за неполного типа в специализациях на основе классов. Эти специализации предназначены для функций-членов, вообще не относятся к лямбда-выражениям и не должны оцениваться (или, по крайней мере, оцениваться и не соответствовать, а не вызывать ошибку компиляции).
Как я могу определить специализации coroutine_traits на основе классов, чтобы лямбда-выражения не вызывали ошибок компилятора?


Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-lambdas
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»