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