假设我有一个类Foo,它使用两种不同的泛型类型,一个是_Type
,另一个是_Comparator
。 _Type
已知为std::vector
,std::list
或std::string
,因此其中会有一个类型:T
将在vector
内}和list
; char
将在string
内。
我的其他泛型类型_Comparator
是一个可选的模板参数,用户可以通过该参数指定自己的函数,函子或lambda函数。如果没有提供参数作为第二个模板参数,则它应默认为std::less<M>
仿函数,其中类型M
应为_Type
中包含的元素类型。
我不知道如何执行此操作的语法。
我试过了:
template <typename _Type<T>, typename _Comparator = less<T> >
无济于事。
答案 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)
正如您所说,您只想支持vector
,list
和string
,您可以使用此功能:
template <typename T, typename Compare = std::less<typename T::value_type>>
这将支持具有成员typedef value_type
的所有类型,vector
,list
和string
都可以。{/ p>
使用可变参数模板模板参数可以支持其他类型,但这会变得更加复杂。