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

C++ 提取C+中另一个泛型类型的泛型类型+;,c++,templates,generics,C++,Templates,Generics,假设我有一个类Foo,它使用两种不同的泛型类型,一种是\u Type,另一种是\u Comparator\u Type已知为std::vector、std::list或std::string,因此它将在其中包含一个类型:T将在vector和list中字符将在字符串中 我的另一个泛型类型\u Comparator是一个可选的模板参数,用户可以通过它指定自己的小于函数、函子或lambda函数。如果没有提供参数作为第二个模板参数,它应该默认为std::lessfunctor,其中typeM应该是\u

假设我有一个类Foo,它使用两种不同的泛型类型,一种是
\u Type
,另一种是
\u Comparator
\u Type
已知为
std::vector
std::list
std::string
,因此它将在其中包含一个类型:
T
将在
vector
list
中<代码>字符将在
字符串

我的另一个泛型类型
\u Comparator
是一个可选的模板参数,用户可以通过它指定自己的小于函数、函子或lambda函数。如果没有提供参数作为第二个模板参数,它应该默认为
std::less
functor,其中type
M
应该是
\u type
中包含的元素类型

我不知道如何做到这一点的语法

我试过:

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

没用。

如果我正确理解了您的问题,您可以尝试以下方法:

#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;
}
#包括
#包括
#包括
#包括
模板
阶级持有者
{
公众:
模板
类impl
{
公众:

impl(){std::cout使用@Joachim Pileborg在评论中提到的方法,我能够得出以下结果,这允许我访问
\u type
的内部类型:

template <typename _Type, 
    typename _Comparator = less<typename _Type:: value_type> >
class Foo
{
    public:
        // some methods
    private:
        _Type sequence;
        _Comparator comparator;
};
模板
福班
{
公众:
//一些方法
私人:
_类型序列;
_比较器;
};

现在
std::less
比较了正确的类型,没有任何抱怨。

正如您所说,您只想支持
向量
列表
字符串
,您可以使用:

template <typename T, typename Compare = std::less<typename T::value_type>>
模板
这将支持具有成员类型def
value\u type
、成员类型向量
列表
、成员类型字符串的所有类型


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

请注意,您的名称无效:以下划线开头,后跟大写字母的名称保留用于实现,您不能在代码中使用它们。所有容器类型都有
值Type
typedef。因此,如果您确定
Type
始终是一个容器,您可以使用
Type::value\u Type
来访问包含的类型。是的,
std::string
是一个容器,一个非常专门的容器。@KonradRudolph我有点困惑:为哪个实现保留?还有,tem的名称模板参数是在家庭作业中给出的,因此我认为它们应该是有效的,否则我在这里误解了你。编译器实现。如果你的老师给了你这些名称,你应该告诉老师停止。注意。我会向他提这一点。
Type
没有默认的模板参数,例如
std::vector
。没关系,只需删除它,在本例中,您还需要为
holder\u of_int\u vectors
明确指定它:
holder::impl
是的,这就是我最终使用的。请参见下面的答案。我认为它简单易行,因为我不需要全面的支持。