【问题标题】:Merging types from variadic template using template-template arguments使用模板模板参数从可变参数模板合并类型
【发布时间】:2016-01-22 01:06:53
【问题描述】:

我正在尝试扩展通过模板模板传递的参数列表。第一个示例有效,第二个示例无效。我正在寻找的结果是,在第二个示例中,cWapperObject.cMemberVariable.cTuple 的类型为 std::tuple<double, float, short, int>。我怎样才能做到这一点? (请不要在 cmets 或答案中提及库提升)。

示例 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;
}

【问题讨论】:

  • 我使用的是 gcc 版本 4.9.2,报告的错误是 main.cc:9:33: error: 'TS' was not declared in this scope

标签: c++ templates c++11 variadic-templates template-templates


【解决方案1】:

CObject 是一个类模板,它可以用作模板模板参数。 CObject&lt;short, int&gt; 是一种类型,它不能用作模板模板参数,模板模板参数本身也不携带任何实际的类型模板参数。您仍然可以使用部分特化,利用模板模板参数以及用于实例化模板的实际类型模板参数来推断类模板名称及其参数:

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;
};

DEMO

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2014-06-07
  • 2012-03-28
相关资源
最近更新 更多