Давеча упоролся шаблонами настолько, что потребовалось сделать на C++ что-то вот такое (проще сперва показать на примере, а уже потом рассказывать словами):
template< typename First_base, typename Second_base >
class Some_complex_template
: public First_base // Boom #1
, public Second_base // Boom #2
{
public :
// Constructor.
template< typename... First_base_args, typename... Second_base_args >
Some_complex_template(
First_base_args &&...first_args, // Args for the first base class.
Second_base_args &&...second_args ) // Args for the second base class.
: First_base{ std::forward<First_base_args>(first_args)... }
, Second_base{ std::forward<Second_base_args>(second_args)... }
{}
...
};
|
Т.е. нужно было отнаследовать шаблонный класс Some_complex_template от двух других классов, которые задаются параметрами шаблона. А затем в конструктор Some_complex_template нужно было передать два независимых друг от друга набора параметров. Первый набор параметров должен уйти в конструктор первого базового класса,
второй набор -- в конструктор второго базового класса.
Насколько я понимаю, C++ не позволяет написать фукнцию/метод с переменным количеством параметров вот так: f(First &&...first, Second &&...second), что логично, т.к. при вызове f(a1, a2, a3, a4, a5) невозможно понять, что из a(i) относится к first, а что к second.
Поэтому выход из ситуации сейчас ищется в использовании std::tuple вот в таком сценарии:
template< typename First_base, typename Second_base >
class Some_complex_template
: public First_base
, public Second_base
{
public :
// Constructor.
template< typename... First_base_args, typename... Second_base_args >
Some_complex_template(
std::tuple<First_base_args...> && first_args, // Args for the first base class.
std::tuple<Second_base_args...> && second_args ) // Args for the second base class.
: First_base{ /*some magic is required here!*/(first_args)... }
, Second_base{ /*some magic is required here!*/(second_args)... }
{}
...
};
|
Но вот тут возникает вопрос, как же распаковать содержимое std::tuple в вызов конструктора базового типа?
В принципе, вся эта магия с распаковкой std::tuple в вызов некоторой функции f хорошо проиллюстрирована на том же cppreferece.com в описании возможной реализации функции std::apply. Но есть нюанс: нам нужно сделать вызов конструктора базового типа, поэтому у нас нет возможности заводить вспомогательные функции, вроде apply_impl, в которые передается дополнительный аргумент std::index_sequence...
Или все-таки есть?