我想知道是否可以通过以下方式专门化模板:
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
不必是单独的类型。有谁能够帮助我?
最佳答案
我不这么认为。
因为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...
};
您可以在其中使用
Ts
和Tts
。但这不是一个好的解决方案,因为您不能简单地将容器
TypeList
定义为TypeList<AT, BT, CT> tcl;
但您必须添加包含的伪(?)类型,如下所示
TypeList<AT<int>, BT<float>, CT<double>> tl2;
另一个问题是您无法将它们混合在一起,因此
TypeList<AT<int>, BT<float>, double> tl;
调用
TypeList
的基本版本(无容器)。