将模板包装在另一个模板中

时间:2019-05-20 20:32:50

标签: c++ templates c++03

我有一对这样的类模板声明:

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的实际版本兼容。

1 个答案:

答案 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