Часто мне приходилось выполнять повторяющуюся работу по добавлению параметров шаблона в std::variant или std::tuple, чтобы соответствовать требованиям, предъявляемым кодом, использующим их экземпляры. Поэтому мне было интересно, можно ли вывести параметры шаблона не только при вызове конструктора, но и на основе вызовов объектов. Например
Код: Выделить всё
#include
#include
int main(){
using MyInferredTuple = std::tuple;
MyInferredTuple t;
t.get() = 2;
return t.get().length() + t.get();
}
Возвращаемое значение функции main() будет равно 2, потому что std::string по умолчанию будет создан в строке MyInferredTuple t;, а MyInferredTuple будет std::tuple.
Я знаю, что у этой идеи есть некоторые ограничения и нерешенные проблемы, а именно:
- Используемые типы должны иметь конструктор по умолчанию.
- Не всегда возможно определить порядок выводимых типов, поэтому останется неупорядоченный набор типов, которые невозможно канонически сопоставить с набор упорядоченных типов аргументов шаблона.
- При использовании в разных единицах перевода потребуется найти все случаи использования, прежде чем можно будет определить фактический тип шаблонного типа MyInferredType.
- Идентификация одного и того же выведенного типа в разных TU, а также в пределах одного TU потребует предварительного присвоения имени, как это сделано здесь, обозначено с помощью для различать разные выводимые типы, поэтому на самом деле использование было бы неправильным ключевым словом, для него потребовалось бы новое ключевое слово.
Мне хотелось бы узнать об исходной информации и обсуждении такого использования вывод типов шаблонов на основе C++ и вообще.
Подробнее здесь: https://stackoverflow.com/questions/798 ... d-on-usage
Мобильная версия