Мне нужно реализовать некоторые методы, аналогичные vector::emplace
для моих собственных структур данных. В общем случае я бы реализовал их так, чтобы они поддерживали идеальную пересылку, т. Е. С помощью rvalue-ссылки, std::forward
и тому подобное.
Однако, что если я знаю, что все параметры для пересылки являются примитивными типами, такими как int
или же float
, Имеет ли смысл реализовывать совершенную пересылку для примитивных типов?
Другими словами, есть ли разница между следующими двумя фрагментами кода, если предположить, что мы используем только примитивные типы в качестве параметров шаблона?
template <typename... Args>
void wrapper(Args&& ... args) {
func(std::forward<Args>(args)...);
}
а также
template <typename... Args>
void wrapper(Args ... args) {
func(args...);
}
Дополнительно: есть ли разница, если мы знаем, что параметрами шаблона могут быть только классы, которые содержат только примитивные типы? Или классы, которые содержат только примитивные типы, и другие классы, которые сами содержат только примитивные типы?
Нет, абсолютно бессмысленно использовать идеальную пересылку для базовых типов:
Есть одно исключение:
Нет способа избежать принятия выходных параметров по ссылке.
Кроме того, если вы все равно пишете шаблон, вы абсолютно уверены, что никогда не захотите использовать его с более сложными типами?
YAGNI (он вам не понадобится) очень важен, но и не мешает себе позже из-за ненужного ограничения вашего интерфейса.
И всегда помните старую пословицу «Преждевременная оптимизация — корень всего зла».