在C ++中提取另一个泛型类型的泛型类型

时间:2014-04-24 12:30:10

标签: c++ templates generics

假设我有一个类Foo,它使用两种不同的泛型类型,一个是_Type,另一个是_Comparator_Type已知为std::vectorstd::liststd::string,因此其中会有一个类型:T将在vector内}和list; char将在string内。

我的其他泛型类型_Comparator是一个可选的模板参数,用户可以通过该参数指定自己的函数,函子或lambda函数。如果没有提供参数作为第二个模板参数,则它应默认为std::less<M>仿函数,其中类型M应为_Type中包含的元素类型。

我不知道如何执行此操作的语法。

我试过了:

template <typename _Type<T>, typename _Comparator = less<T> >

无济于事。

3 个答案:

答案 0 :(得分:2)

在评论中使用@Joachim Pileborg提到的方法,我能够提出以下内容,这使我能够访问_Type的内部类型:

template <typename _Type, 
    typename _Comparator = less<typename _Type:: value_type> >
class Foo
{
    public:
        // some methods
    private:
        _Type sequence;
        _Comparator comparator;
};

现在std::less在没有抱怨的情况下比较正确的类型。

答案 1 :(得分:0)

如果我理解你的问题,你可能会尝试类似的事情:

#include <iostream>
#include <vector>
#include <list>
#include <typeinfo>

template <typename T>
class holder
{
public:
    template <typename Type = std::vector<T>, typename Comparator = std::less<T> >
    class impl
    {
    public:
        impl() {std::cout << typeid(s).name() << std::endl; }
        Type s;
    };

} ;

int main()
{
    holder<int>::impl<> holder_of_int_vectors;
    holder<int>::impl<std::list<int> > holder_of_int_lists;
    holder<int>::impl<std::list<int>, std::greater<int> > holder_of_int_lists_with_greater;
}

即,使用外部类来保持&#34;基本&#34;输入(T)和容器的内部(Type)和比较器。

答案 2 :(得分:0)

正如您所说,您只想支持vectorliststring,您可以使用此功能:

template <typename T, typename Compare = std::less<typename T::value_type>>

这将支持具有成员typedef value_type的所有类型,vectorliststring都可以。{/ p>

使用可变参数模板模板参数可以支持其他类型,但这会变得更加复杂。