Параметрированные вызовы методов полезны, если вы хотите разрешить разные типы без кастования. Например, вспомогательный класс Collections широко использует вызовы параметризованных методов. Если вы хотите создать новую общую коллекцию, используя один из своих вспомогательных методов, несколько примеров:
List anEmptyStringList = Collections.emptyList();
Set unmodifiableCopy = Collections.unmodifiableSet(originalSet);
Итак, если вы хотите использовать общий тип в другом месте, вы хотите использовать эти вызовы методов. Они предотвращают предупреждения компилятора при использовании дженериков.
template<class F>
auto shared_function( F&& f ){
auto spf=std::make_shared<std::decay_f<F>>(std::forward<F>(f));
return [spf=std::move(spf)](auto&&...args)->decltype(auto){
return (*pf)(decltype(args)(args)...);
};
}
владеет им в общем ptr. Немного меняет семантику, но исправляет ее.
Или напишите свою собственную функцию non-copyd std.