如何在C ++ / CLI中使用模板化通用约束

时间:2011-11-02 16:43:48

标签: templates generics c++-cli constraints

我在查明是否可以在C ++ / CLI中使用模板化通用约束时遇到了一些麻烦。这是一个例子

template<typename T>
public ref class wrapped 
{
public:
    T* t;

    T doTthing(){return *t;}
};

这是一个简单的模板化托管类,包装一个非托管类型T.我可以使用这个类作为泛型的约束

// works
generic<class genclass> where genclass : wrapped<int>
public ref class testclass3
{
public:
    genclass gc;

    int test()
    {
        return gc->doTthing();
    }
};

这很好用。我无法弄清楚的是如何保留模板和通用,即

//Does Not Work!
template<typename T>
generic<class genclass>  where genclass : wrapped<T>
public ref class testclass4
{
public:
    genclass gc;

    T test()
    {
        return gc->doTthing();
    }
};

这种事情有可能吗?

1 个答案:

答案 0 :(得分:3)

您不能在同一声明中将模板与泛型混合使用。

该类应该是模板化的或通用的。请参阅:Managed Templates

模板更具表现力,所以我建议你改用它们。

如果你想模拟一个约束(相同的技术可以在c ++中工作......)你可以这样做:

template<class T, class GENCLASS>
public ref class testclass4
{
private:
    typedef typename GENCLASS::wrapped<T> Constraint1;
public:
    genclass gc;

    T test()
    {
        return gc->doTthing();
    }
};

如果类没有从wrapped<T>继承,则typedef声明将失败,说“wrap不是GENCLASS的成员”。