Boost-DI с концептуальным статическим полиморфизмомC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Boost-DI с концептуальным статическим полиморфизмом

Сообщение Anonymous »

Я использую Boost.DI и добился больших успехов в его изучении. Однако я столкнулся с проблемой, которую не знаю, как именно исправить.
Следующее компилируется, связывается и выполняется как положено:

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

class CC
{
public:
void Log(std::string_view) {}
};

template
class Host
{
TC& c;

public:
BOOST_DI_INJECT(Host, TC& c)
: c(c)
{
c.Log("moop");
}
};
Проблема в том, что нигде не применяется ни одно понятие. Я могу написать код и получу ошибки во время компиляции, но не получу завершения кода Intellisense, потому что на момент написания Host он еще не знает, что такое TC. Это особенно плохо, потому что предложить концепцию для этого тривиально:

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

template
concept IC = requires(T t, std::string_view message)
{
t.Log(message);
};
Однако попытка применить эту концепцию приводит к ошибке времени компиляции, указывающей на то, что концепция не удалась, поскольку TC является неполным:

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

template //               (...)\include\boost\di.hpp(2792,103):
1>              'Host': the associated constraints are not satisfied
1>                  (...)\main.cpp(28,10):
1>                  the concept 'IC' evaluated to false
1>                      (...)\main.cpp(19,2):
1>                      use of undefined type 'C'
1>                      (...)\main.cpp(28,18):
1>                      see declaration of 'C'
1>                      (...)\main.cpp(19,4):
1>                      left of '.Log' must have class/struct/union
Однако даже в случае неудачи я получаю свой Intellisense, как и ожидалось, поэтому это заставляет меня поверить, что это выполнимо:
Изображение

Согласно официальной документации, способы использования концепций подразумевают ветку для не is_complete, чтобы разрешить неполные типы:

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

template
concept IC = requires(T t, std::string_view message)
{
t.Log(message);
} or not boost::di::aux::is_complete::value;
Это снова работает правильно и подтверждает существование функции во время компиляции, но Intellisense снова терпит неудачу. Насколько я могу судить, она просто использует ветку неполного типа (возможно, потому, что она наиболее разрешающая?) и поэтому понятия не имеет
что делать с моим шаблонным параметром:
Изображение

Итак, есть ли способ заставить эту библиотеку работать с полиморфизмом на основе концепций позволяя при этом Intellisense работать? Может быть, я использую современную концепцию C++ (без каламбура), с которой я не знаком?

Подробнее здесь: https://stackoverflow.com/questions/798 ... lymorphism
Ответить

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

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

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

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

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