2016-08-11 3 views
2

У меня естьКак я могу заставить Eclipse делать предположения о параметрах моего шаблона?

template <typename T> class Foo : public T { /* ... */ } 

и я только его экземпляр с T с, которые являются подклассами Bar. Если это помогает, я могу установить static_assert.

Итак, Eclipse CDT не распознает, что T «действительно» также является Bar. Я не могу жаловаться на это - но могу ли я сделать он это понимает? То есть, могу ли я как-то сказать Indexer искать методы и типы в классе Bar в качестве базового класса Foo?

ответ

0

Это действительно хороший вопрос!

В настоящее время нет способа сообщить Eclipse, что шаблон будет создан только с аргументами, которые являются подклассами определенного типа.

Однако есть предстоящая C++ язык функция, которая позволит вам выразить эти отношения в вашем коде, и для Eclipse, чтобы поднять на него, а также: Concepts.

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

Например, вы можете написать такое понятие, как это:

template <typename T> 
concept bool DerivedFromBar = std::is_base_of<Bar, T>::value; 

Это определяет концепцию DerivedFromBar, которая выполняется только по видам, которые являются производными от Bar.

Вы можете использовать эту концепцию в своем определении шаблона класса:

template <DerivedFromBar T> class Foo : public T { /* ... */ } 

Обратите внимание на использование DerivedFromBar вместо обычного typename объявить параметр шаблона T. Это говорит компилятору, что T ограничено, чтобы удовлетворить DerivedFromBar.

Как только вы выражаете свой код таким образом, Eclipse может в принципе сделать выводы, которые позволили бы ему предлагать членам Bar в качестве предложений автозаполнения при вызове метода на объект типа T внутри шаблона.

Концепции в настоящее время поддерживаются GCC, с другими компиляторами, такими как MSVC и clang, которые работают над его реализацией.

Bug 492682 треков Поддержка концепций в Eclipse CDT. Воспользовавшись концепциями для лучшего автозаполнения, мы будем использовать последующую функцию.