我有一对这样的类模板声明:
template<typename T, template<typename W> class X>
struct B {
bool operator()(const T& left, const T& right)
{ return X<W>()(left, right); }
};
template<template<typename T> class X, typename Q>
struct A {
bool operator()(const int a, const int b)
{
return B<Q, X>()(a, b);
}
};
我可以创建A<std::greater, int>
,A<std::less, int>
,并且可以根据需要运行。
是否可以创建一个类,该类将包含像std::greater
这样传入的模板,并且在上述示例中仍然可以像std::greater
本身那样传递?
类似这样的东西:
template <template <typename T> class Class>
class Wrapper
{
operator()(const int, const int) { return Class<?what's here?> (value, value); }
};
我想将我的Wrapper
传递给未更改的A
A<Wrapper<std::less>, long>
换句话说,我想模仿传递给我的包装器的模板,以与类A
的实际版本兼容。
答案 0 :(得分:3)
简短的回答是“否”,并不完全像您想要的那样。 A
的第一个参数必须是模板名称。但是,当您添加参数并编写Wrapper<std::less>
时,您将获得一个类类型。它不再是模板。这么想吧,A
希望使用曲奇切割器,但是您要传递由该切割器制成的曲奇。
这并不是说您不能将一个模板转换为另一个模板,但是它不会那么不透明。解决方案是将一个 member 模板添加到Wrapper
。然后Wrapper<std::less>
尽管是类类型,但其成员将是模板。您可以将其传递给A
。
template <template <typename T> class Class>
struct Wrapper
{
template<typename U> // member template
struct temp {
bool operator()(const int v1, const int v2)
{ return Class<U>()(v1, v2); }
};
};
这使您可以编写A<Wrapper<std::less>::temp, long>
。
签出live。