Слияние типов от вариативный шаблон, используя шаблонные аргументы


Я пытаюсь расширить список аргументов, передаваемых через шаблон шаблона. Первый пример работает, второй-нет. результат, который я ищу, будет состоять в том, что во втором примере cWapperObject.cMemberVariable.cTuple имеет тип std::tuple<double, float, short, int>. Как я могу этого достичь? (И пожалуйста, пожалуйста, не упоминайте библиотечный буст в комментариях или ответах).

Пример 1:

#include <tuple>

template<class ... TS> class CObject {
   std::tuple<TS ...> cTuple;
};

template<template<typename ... TS> class TMPL_CLASS_T>
class CWrapperObject {
    TMPL_CLASS_T<double, float, short> cMemberVariable;
};

int main() {
   CWrapperObject<CObject> cWapperObject;
   return 0;
}

Пример 2:

#include <tuple>

template<class ... TS> class CObject {
   std::tuple<TS ...> cTuple;
};

template<template<typename ... TS> class TMPL_CLASS_T>
class CWrapperObject {
    TMPL_CLASS_T<double, float, TS ...> cMemberVariable;
};

int main() {
   CWrapperObject<CObject<short, int>> cWapperObject;
   return 0;
}
1 2

1 ответ:

CObject является шаблоном класса, его можно использовать в качестве аргумента template-template. CObject<short, int> - это тип, он не может использоваться в качестве аргумента шаблона-шаблона, и сам параметр шаблона-шаблона не несет никаких фактических аргументов шаблона типа. Вы все еще можете вывести имя шаблона класса и его параметры, используя частичную специализацию, используя параметр template-template, наряду с фактическими аргументами шаблона типа, которые были использованы для создания экземпляра класса. шаблон:

template <typename... TS>
struct CObject
{
    std::tuple<TS...> cTuple;
};

template <typename>
struct CWrapperObject;

template <template <typename...> class TMPL_CLASS_T, typename... TS>
struct CWrapperObject<TMPL_CLASS_T<TS...>>
{
    TMPL_CLASS_T<double, float, TS...> cMemberVariable;
};

Демо-версия