C ++ при написании класса-оболочки безопасно ли пересылать все конструкторы с несколькими аргументами? - PullRequest
0 голосов
/ 22 марта 2019

При написании класса-оболочки на 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-тяжелый, тщательно написанная обертка для одинарных конструкторов?(Я предполагаю, что особый случай, когда конструктор обертки вызывается без аргументов, может обрабатываться особенно тривиально.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...