Слияние типов от вариативный шаблон, используя шаблонные аргументы
Я пытаюсь расширить список аргументов, передаваемых через шаблон шаблона. Первый пример работает, второй-нет. результат, который я ищу, будет состоять в том, что во втором примере 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 ответ:
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; };
Демо-версия