При написании класса-оболочки на C ++ приятно иметь возможность передавать аргументы конструкторам с помощью пакетов параметров.Но выполнение простейшей вещи, которая могла бы работать, имеет некоторые недостатки.
// BAD!
template <class ... Types>
wrapper(Types&&... args) : wrapped(std::forward<Types>(args)...) {}
Из того, что я могу понять, это плохо, потому что может скрывать специальные функции-члены.Затенение специальных функций-членов и связанные с ними проблемы, которые обсуждаются во многих местах, включая здесь и здесь .Есть также проблемы, связанные с explicit
-ness или списками инициализаторов , как описано в одном из комментариев к этому вопросу .
Однако мне кажется, что эти проблемы не относятся кслучай конструкторов с >=2
аргументами.
// fine?
template <class FirstType, class SecondType, class... Types>
wrapper(FirstType && first,
SecondType && second,
Types &&... args) :
wrapped(
std::forward<FirstType>(first),
std::forward<SecondType>(second),
std::forward<Types>(args)...
) {
// do nothing
}
Есть ли какой-либо недостаток в том, чтобы бездумно пересылать все> = 2-аргументные конструкторы, используя наивную обертку, подобную приведенной выше, и использовать только сложный SFINAE-тяжелый, тщательно написанная обертка для одинарных конструкторов?(Я предполагаю, что особый случай, когда конструктор обертки вызывается без аргументов, может обрабатываться особенно тривиально.)