如何使用受限模板?

时间:2014-09-22 10:56:31

标签: c++ templates

假设我正在使用以下类:

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

3 个答案:

答案 0 :(得分:2)

您可能需要将班级TE<I,O>的{​​{1}}模板参数设为"template template parameter"

如下:

TQ

这允许模板类template<class I, class O, template <typename, typename> class TE> 在模板类TE中用作模板;即,它允许您在TQTE<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;

Demo

此外,我宁愿为模板参数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;

Live example

任何不匹配的类型(如TQ<int, int, TESO<int, bool>>)都会引发编译时错误