假设我正在使用以下类:
template<class I, class O>
class TE {...}; //This is an abstract class
template<class I, class O>
class TESO: public TE {...};
template<class I, class O>
class TEMO: public TE {...};
现在我要创建一个新类TQ
,它应该像这样初始化:
TQ<int,bool, TESO<int,bool>> tq1;
TQ<int,bool, TEMO<int,bool>> tq2;
我不确定写TQ
班的正确方法是什么。
我正在考虑这个问题:
template<class I, class O, TE<I,O>>
class TQ {
private:
std::vector< TE<I,O> > TEs;
public:
...
};
但我不完全确定,因为我有编译错误:
template<class I, class O, TE<I,O>>
inline std::ostream& operator<<(std::ostream& os, const TE<I,O>& tq) {
os << ":" << std::endl;
return os;
}
答案 0 :(得分:2)
您可能需要将班级TE<I,O>
的{{1}}模板参数设为"template template parameter"。
如下:
TQ
这允许模板类template<class I, class O, template <typename, typename> class TE>
在模板类TE
中用作模板;即,它允许您在TQ
中TE<I,O>
而不仅仅std::vector< TE<I,O> > TEs;
(见下文)中编写代码。
或者,如果std::vector< TE > TEs;
中使用的类型并没有特别要求与TE
中使用的类型相同,则会有一个简单的第三个参数;
TQ
答案 1 :(得分:1)
template<typename I, typename O, template<typename, typename> class TE>
class TQ {
std::vector< TE<I,O> > TEs;
};
TQ<int, bool, TESO> tq1;
TQ<int, bool, TEMO> tq2;
此外,我宁愿为模板参数TE
选择其他名称,以避免与原始class TE
混淆,但即使现在它也可以从TQ
类内部作为::TE<...>
进行访问
答案 2 :(得分:1)
另一种选择是:
template <typename T> class TQ;
// specialization
template <typename I, typename O, template <typename, typename> class C>
class TQ<C<I, O>>
{
// Your implementation.
};
然后使用它:
TQ<TESO<int,bool>> tq1;
TQ<TEMO<int,bool>> tq2;
修改强>:
根据您的要求TQ<int, bool, TESO<int, bool>>
,您可以改为使用:
template <typename I, typename O, typename T> class TQ
{
// cannot be static_assert(false, ""),
// The condition need to be dependent of template type
// to have the error when we want
static_assert(sizeof(I) == 0, "Bad type");
};
// specialization
template <typename I, typename O, template <typename, typename> class C>
class TQ<I, O, C<I, O>>
{
// Your implementation.
};
然后按照您的指定使用它:
TQ<int, bool, TESO<int, bool>> tq1;
TQ<int, bool, TEMO<int, bool>> tq2;
任何不匹配的类型(如TQ<int, int, TESO<int, bool>>
)都会引发编译时错误