模板模板可变参数专业化

时间:2017-05-16 13:58:17

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

我想知道是否有办法以下列方式专门化模板:

template<typename... Ts>
class Typelist { };

template<template<typename> typename... TTs>
class Typelist<TTs<typename>> { };   //I don't know if that is the right syntax, at least the compiler doesn't complain

我希望它可以作为模板化类型列表以及非模板化类型列表:

template<typename T>
class AT {};

template<typename T>
class BT {};

template<typename T>
class CT {};

int main() {

    using tl1 = Typelist<int, float, double>;   //works fine
    using tl2 = Typelist<AT, BT, CT>;   //gives an error

}

编辑:

如果我将secont Typelist声明为单独的类型,那就可以了......

template<template<typename> typename... TTs>
class Typelist2 { };

//...
using tl2 = Typelist2<AT, BT, CT>;   //compiler doesn't complain and it works fine

我想知道是否可以在两种情况下仅使用Typelist,以便Typelist2不必是单独的类型。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

  

我想知道是否可以在两种情况下仅使用Typelist,以便Typelist2不必是单独的类型。

我不这么认为。

因为TypeList被定义为template<typename... Ts>template<template<typename> typename... TTs>;这两个定义都无法发挥作用。

我能想象到的最好的帮助是为简单类型

定义TypeList基础版本
template <typename ... Ts>
struct TypeList
 {
   // here you can use Ts...
 };

和容器的专门化(只有一个类型)如下

template <template <typename> class ... Tts, typename ... Ts>
struct TypeList<Tts<Ts>...>
 {
   // here you can use Ts... and Tts...
 };

您可以使用TsTts

但这不是一个很好的解决方案,因为您无法将容器TypeList简单地定义为

TypeList<AT, BT, CT> tcl;

但您必须添加包含的虚拟(?)类型,如下所示

TypeList<AT<int>, BT<float>, CT<double>> tl2;

另一个问题是你不能混合它们,所以

TypeList<AT<int>, BT<float>, double> tl;

调用TypeList的基本版本(无容器)。