繁体   English   中英

使用部分模板特化选择基类

[英]Using partial template specialization to select base class

我对下面尝试使用的一些高级模板技术不熟悉,所以我怀疑我的术语可能不太正确。 我有一个Box基类型和几个继承自Box类。 我正在尝试基于模板参数构建特定子类的实例。

这是Box<T>类型。 Convert函数可以使用返回类型 U 的函数创建一个新的Box<U>

template<typename T>
class Box : public std::enable_shared_from_this<Box<T>> {
 public:

  // Box<T> --> Box<U>
  template <typename Func>
  auto Convert(Func f) -> std::shared_ptr<Box<decltype(f(std::declval<T>()))>>;

  virtual void Print() {
    std::cout << "box" << std::endl;
  }
};

我可以像这样创建一个新的Box<int>类型:

auto box = std::shared_ptr<Box<int>>(new Box<int>());

为了转换为另一种类型,我们返回一个ConvertedBox类型的子类(实际上我们这样做是因为我们懒惰地应用函数)。

template<typename T, typename U, typename Func>
class ConvertedBox : public Box<T> {
 public:
  ConvertedBox(typename std::shared_ptr<Box<U>> box, Func func) :
    box_(box), func_(func)
  {}

  virtual void Print() {
    std::cout << "converted box" << std::endl;
  }

 private:
  std::shared_ptr<Box<U>> box_;
  Func func_;
};

和方法在这里构造子类实例。

// implementation of convert
template <typename T>
template <typename Func>
auto Box<T>::Convert(Func f) -> std::shared_ptr<Box<decltype(f(std::declval<T>()))>>
{
    using ReturnType = decltype(f(std::declval<T>()));
    auto p = new ConvertedBox<ReturnType, T, Func>(this->shared_from_this(), f);
    return std::shared_ptr<Box<ReturnType>>(p);
}

现在我可以使用如下调用构建一个新的Box<U>

auto converted_float_box = box->Convert([](int v) -> float {
  return (float)v;
});

我想要做的是根据所应用的函数类型专门化Box<>基类。 例如,如果我像这样转换为Box<std::pair<int, int>>

auto converted_pair_box = box->Convert([](int v) -> std::pair<int, int> {
  return std::make_pair(v, v);
});

我希望能够在结果上调用一个仅适用于Box<std::pair<K, V>>的函数(我在这里使用 print 作为示例。实际上,专业化很复杂)。

converted_pair_box->PairOnlyPrint();

我试图在std::pair<K,V>上专门化Box ,但没有运气。

template<typename K, typename V>
class PairBox : public Box<std::pair<K, V>> {
 public:
  void PairOnlyPrint() {
    std::cout << "only pair box" << std::endl;
  };
};

编译器仍在解析Box<>因此PairOnlyPrint不可用。 有没有办法实现这一目标?

编辑 1:正如所指出的, Convert不是一个免费的功能。

您的class PairBox不是专业化,专业化是:

template<typename K, typename V>
class Box<std::pair<K, V>>: public std::enable_shared_from_this<Box<std::pair<K, V>>> {
 public:

  // Box<T> --> Box<U>
  template <typename Func>
  auto Convert(Func f)
  -> std::shared_ptr<Box<decltype(f(std::declval<std::pair<K, V>>()))>>;

  virtual void Print() { std::cout << "pair box" << std::endl; }
  void PairOnlyPrint() { std::cout << "only pair box" << std::endl; };
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM